详细解决redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

这篇具有很好参考价值的文章主要介绍了详细解决redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 复现错误


今天从gitlab上下载本公司的项目,但在启动时报出如下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisKeyExpirationListener' defined in file [D:\Software\...\RedisKeyExpirationListener.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	......
Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
	at org.springframework.data.redis.listener.KeyspaceEventMessageListener.init(KeyspaceEventMessageListener.java:80)
	at org.springframework.data.redis.listener.KeyspaceEventMessageListener.afterPropertiesSet(KeyspaceEventMessageListener.java:132)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 59 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
	at redis.clients.util.Pool.getResource(Pool.java:53)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:191)
	... 64 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
	at redis.clients.jedis.Connection.connect(Connection.java:207)
	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
	at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
	at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:49)
	... 67 more
Caused by: java.net.SocketTimeoutException: connect timed out
	at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at redis.clients.jedis.Connection.connect(Connection.java:184)
	... 74 more

具体的错误信息为redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

2. 分析错误


根据上述报错信息可知,这是redis出现了错误。

  1. 首先,检查我的redis的配置信息,如下代码所示:
########################################
###
### 2.redis的配置
###
########################################
cache:
  redis:
    db: 12
    enable: true
    hostName: 127.0.0.1
    password: test
    port: 6379

据此可以看出,我的redis配置没有问题。

  1. redis配置既然没有问题,则去检查Jedis ConnectionFactory的配置是否存在问题,如下代码所示:
<!-- Jedis ConnectionFactory -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${cache.redis.hostName}"/>
    <property name="port" value="${cache.redis.port}"/>
    <property name="password" value="${cache.redis.password}"/>
    <property name="database" value="${cache.redis.db}"/>
    <property name="usePool" value="true"/>
    <property name="poolConfig">
        <!-- jedisPoolConfig -->
        <bean class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="100"/>
            <property name="minIdle" value="20"/>
            <property name="maxWaitMillis" value="10000"/>
        </bean>
    </property>
</bean>

由上代码所示,Jedis ConnectionFactory的配置也没有问题。

  1. 继续分析错误信息,错误信息说Error creating bean with name 'redisKeyExpirationListener'...,即无法创建redisKeyExpirationListener的bean对象,则去检查RedisKeyExpirationListener类,如下代码所示:
/**
 * @author super先生
 * @datetime 2023/3/12 16:30
 * @desc  这是对redis key过期的监听器
 */
@Component
@Conditional({RedisCondition.class})
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
  private Logger LOG = LoggerFactory.getLogger(this.getClass());

  @Autowired
  private StringRedisTemplate redisTemplate;
  @Autowired
  private ProjectDao projectDao;

  public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
      super(listenerContainer);
  }

  @Override
  public void onMessage(Message message, byte[] pattern) {
      String key = message.toString();
      LOG.info("{} 缓存已到期", key);

      String[] split = key.split("_");
      if ("timer".equals(split[1])) {
          //
          if (!redisTemplate.hasKey(split[0])) {
              // 如果没有key,删除定时器key
              redisTemplate.delete(key);
              LOG.info("{} 对应的数据不存在,已删除", key);
              return;
          }
          String value = redisTemplate.opsForValue().get(split[0]);
          DashboardBoard dashboardBoard = JSONObject.parseObject(value, DashboardBoard.class);
          if (dashboardBoard == null) {
              // 重新设置key
              redisTemplate.opsForValue().set(split[0] + "_timer", "", 5, TimeUnit.MINUTES);
              LOG.info("{} 缓存重设", split[0]);
              return;
          }

          try {
              projectDao.update(dashboardBoard);
              redisTemplate.delete(split[0]);
              LOG.info("数据持久化, {} 缓存删除", split[0]);
          } catch (Exception e) {
              e.printStackTrace();
              // 重新设置key
              redisTemplate.opsForValue().set(split[0] + "_timer", "", 5, TimeUnit.MINUTES);
              LOG.info("{} 缓存重设", split[0]);
          }
      }
  }
}

经过对RedisKeyExpirationListener类的检查,没有返现任何问题。

  1. 继续分析上述错误,直至看到connect timed out错误信息。

connect timed out表示连接超时,也就是说,我的redis没有启动。

我经过反复检查后,发现我的redis确实没有启动。

3. 解决错误


由于我没有启动redis,启动redis即可,如下图所示:

程序包redis.clients.jedis不存在,免费专栏,redis,java,数据库,后端,spring

重新启动项目,即可成功运行,如下图所示:

程序包redis.clients.jedis不存在,免费专栏,redis,java,数据库,后端,spring

4. 解决此错误的其他办法


我的是因为没有启动redis,导致了这个错误:Could not get a resource from the pool

如果你的redis启动了,但仍报出这个错误,可以参考如下解决方法,来解决你的错误:

  1. 检查redis是否崩溃(宕机)。

  2. 检查redis的连接池

输入如下命令,进入redis服务器:

./redis-cli -h 127.0.0.1 -p 6379 -a passwd

输入如下命令,查看当前连接数:

INFO clients

程序包redis.clients.jedis不存在,免费专栏,redis,java,数据库,后端,spring

  1. 检查redis服务器的最大连接数配置,如果需要,请将其增加。

输入如下命令,查看最大连接数:

config get maxclients

程序包redis.clients.jedis不存在,免费专栏,redis,java,数据库,后端,spring

  1. 检查网络连接是否正常,并确保防火墙未阻止连接。

  2. 检查redis服务器的配置文件和协议是否正确。文章来源地址https://www.toymoban.com/news/detail-703144.html

到了这里,关于详细解决redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis教程 二 redis客户端Jedis使用

    在Redis官网中提供了各种语言的客户端,地址:https://redis.io/docs/clients/ 其中Java客户端也包含很多但在开发中用的最多的还是Jedis,接下来就让我们以Jedis开始我们的快速实战。 入门案例详细步骤 案例分析: 创建工程: 创建一个maven管理的java项目 引入依赖: 在pom.xml文件下添

    2024年02月05日
    浏览(50)
  • java:使用Jedis操作redis

    Redis是一个基于内存的高性能键值存储数据库,支持多种数据结构,如字符串、列表、集合等。在Java中,我们可以通过Jedis客户端来操作Redis数据库。 安装Jedis客户端 在Java应用程序中使用Jedis客户端之前,需要将其添加到项目中。可以通过Maven或Gradle来管理依赖。下面是Maven的

    2024年02月07日
    浏览(39)
  • java操作redis之jedis

    我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?对于Java连接Redis的开发工具有很多,这里先介绍通过Jedis实现对Redis的各种操作。(前提是你的redis已经配置了远程访问) 到这里Jedis如何连接redis以及常用操作已经了解了,其实这里的操作方法和

    2024年02月09日
    浏览(34)
  • Jedis(一)与Redis的关系

    目录 一、Jedis介绍: 1、背景: 2、Jedis连接池介绍: 二、Jedis API: 1、连接池API 2、其他常用API:  三、SpringBoot集成Jedis:  1、Redis集群模式: (1)配置文件:配置redis、jedis属性信息 (2)Jedis连接池配置类,连接Redis: (3)Jedis工具类:这里展示基本CRUD操作 2、Redis单机模

    2024年01月24日
    浏览(35)
  • Redis-redis事务、乐观锁、Jedis、SpringBoot整合Redis

    1、事务 ①开启事务、执行事务 ② 取消事务 ③ 编译性异常(代码有问题! 命令有错!),事务中所有的命令都不会被执行! ④ 运行时异常(I/O),如果事务队列中存在语法行,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常! (区别于直接命令错误

    2024年01月16日
    浏览(43)
  • 【Spring Boot 3】【Redis】集成Jedis

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月19日
    浏览(53)
  • Redis的Java客户端-Jedis

    在 Redis官网 中提供了各种语言的客户端,地址: https://redis.io/docs/clients/ 其中Java客户端也包含很多: 标记为 ❤ 的就是推荐使用的java客户端,包括: Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis是对这两种做了抽象和封装。 Redisso

    2024年02月19日
    浏览(43)
  • 【Springboot系列】整合redis+jedis(含源码)

    Spring Boot集成Redis和Jedis客户端使用Redis有以下主要特点: ​ 👉简单易用只需要添加相关依赖和简单配置,就可以直接在Spring Boot应用中使用Jedis客户端操作Redis。这大大简化了使用Redis的难度。 ​ 👉自动配置Spring Boot会根据类路径中的Jedis版本自动配置JedisConnectionFactory。我们只

    2024年02月12日
    浏览(44)
  • 【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)

    Jedis 的使用:https://redis.io/docs/clients/java/ 🌼 Jedis 实例是线程不安全的 🌼 多线程环境 下需要基于连接池来使用 🌼 这里使用的连接池技术是 Jedis 提供的 🍀 JedisPool :Redis 连接池 🍀 JedisPoolConfig :Redis 连接池的配置 🍃 SpringData 是 Spring 中数据操作的模块,包含对各种数据库

    2024年02月11日
    浏览(40)
  • Redis-Java客户端-Jedis

    目录 01.导入依赖 02.进行测试连接 03.使用JedisPool 04.修改测试的代码         新建一个mevan工程,在pom文件下导入相应的依赖,相依的依赖可以去官网查找 spring官网:Spring Data Redis         在test目录下,创建一个测试类JedisTest 这里可能回报密码的错误, 可能需要去设置

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包