最近有个项目中的redis每天都会报 "Could not get a resource from the pool"的错误,而这套代码在另一地方部署又没有问题。一直找不到错误原因。按字面意思是连接池中资源不够。

1. 有可能是并发太高而连接池太小,尝试修改连接池上限来解决问题,修改方法如下:

  <!-- redis连接池的配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${spring.redis.maxTotal}"/>
<property name="maxIdle" value="${spring.redis.maxIdle}"/>
<property name="minIdle" value="${spring.redis.minIdle}"/>
<property name="testOnBorrow" value="${spring.redis.testOnBorrow}"/>
<property name="testOnReturn" value="${spring.redis.testOnReturn}"/>
</bean>

修改 maxTotal 到 60 100 300,可以改变连接池大小

spring.redis.maxTotal=8
spring.redis.maxIdle=8
spring.redis.minIdle=1
spring.redis.testOnBorrow=true
spring.redis.testOnReturn=true

将连接池上限修改到很大,运行后发现还是没有解决,仍然报错,有时还会报 "clusterdown the cluster is down"。将maxIdle与minIdle调大,也是一样没有效果。

2. 有网友说有可能是redis连接没有被释放,连接池设再大也没用。项目使用了spring-data-redis,按理释放是不需要自己处理的,项目使用的配置如下:

  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer"/>
</bean>

这里并没有使用redis事务功能,默认情况下 RedisTemplate 的 enableTransactionSupport = false, 所以不需要手动释放连接。

关于开启事务后手动释放的代码,参考这里(https://www.cnblogs.com/DDgougou/p/10268206.html)

3.网上有网友说有可能是jedis版本的问题,当前项目使用的版本为:

    <dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

更新到2.9.3,继续测试。

    <dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>

测试发现,提示终于有变化了,不再显示"Could not get a resource from the pool",但问题还是没有解决,因为项目使用集群的原因,变成提示"Too many Cluster redirections",这是什么鬼???确实没有了连接池的错误提示,但又出现新的问题。

4. 检查redis集群,"Too many Cluster redirections"的意思是连不上其中一个节点,尝试连另一个配置的节点,如果都连不上,就会提示这个错误。检查redis集群方法如下:

利用redis-cli命令进行远程检查

redis-cli -h 127.0.0.1 -p
// 连接成功 如果设置了密码,需要运行命令 auth xxx xxx为密码
运行 cluster info 检查

执行结果,集群正常

xxx:> cluster info
cluster_state:ok
cluster_slots_assigned:
cluster_slots_ok:
cluster_slots_pfail:
cluster_slots_fail:
cluster_known_nodes:
cluster_size:
cluster_current_epoch:
cluster_my_epoch:
cluster_stats_messages_sent:
cluster_stats_messages_received:
(.53s)

集群没问题,但总会偶尔连不上,因为把做了3个节点(redis与mysql装在同一台服务器上),全连不上的机率不大,所以最大的可能就是服务器或者服务器的网络出问题,造成"Too many Cluster redirections"这个错误的发生。

最后通过观察发现出错的规律,当mysql在执行一个很耗时的存储过程CPU高得飞起时,就很容易出现报错的情况。最终基本确定是服务器突然卡引起的异常,所以才会一会正常偶尔又会报错。

经过一天的验证与解决,出现"Could not get a resource from the pool"进的解决方法总结如下:

1. 参数问题,有可能是连接池太小引起

2. jedis版本问题引起

3.服务器性能引起

最终把redis移到另一台服务器上,问题解决。

记redis一次Could not get a resource from the pool 异常的解决过程的更多相关文章

  1. Redis的安装以及spring整合Redis时出现Could not get a resource from the pool

    Redis的下载与安装 在Linux上使用wget http://download.redis.io/releases/redis-5.0.0.tar.gz下载源码到指定位置 解压:tar -xvf ...

  2. redis中 Could not get a resource from the pool 异常解决

    https://blog.csdn.net/qh_java/article/details/54669973

  3. 记一次 java 连接 linux ssh服务 权限验证失败的原因和解决过程

    下面的问题我是通过之前的ssh测试类找出原因的,因为我的测试类跑通了,但是程序跑不通,看了一下源码发现还有一处没有进行解密,所以才会权限验证失败. // 出现权限验证失败的原因就在这里,因为老板要求对 ...

  4. Redis一个异常的解决办法,异常描述:Could not get a resource from the pool

    异常描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poo ...

  5. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  6. redis提示Could not get a resource from the pool(jedis连接池配置)

    起初在JedisPool中配置了50个活动连接,但是程序还是经常报错:Could not get a resource from the pool 连接池刚开始是这样配置的: JedisPoolCon ...

  7. redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

    超时 Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: jav ...

  8. redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)

    对这段时间redis性能调优做一个记录. 1.单进程单线程 redis是单进程单线程实现的,如果你没有特殊的配置,redis内部默认是FIFO排队,即你对redis的访问都是要在redis进行排队,先 ...

  9. redis客户端可以连接集群,但JedisCluster连接redis集群一直报Could not get a resource from the pool

    一,问题描述: (如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool 但是使 ...

随机推荐

  1. 【DataStage】使用Sequence Job报错:CopyOfseq_ld..JobControl (fatal error from @Coordinator): Sequence job (restartable) will abort due to previous unrecoverable errors

    错误描述: 在使用Sequence Job加载作业的时候,报了个错,详细错误内容如下: 出现这个错误的原因是由于以下配置问题,Excution action的状态为Run造成. 解决方案: 将Excu ...

  2. 【2019.12.04】SDN上机第6次作业

    实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...

  3. hadoop综合

    对CSV文件进行预处理生成无标题文本文件,将爬虫大作业产生的csv文件上传到HDFS 首先,我们需要在本地中创建一个/usr/local/bigdatacase/dataset文件夹,具体的步骤为: ...

  4. JAVA从服务器下载文件根据Url把多文件打包成ZIP下载

    注意: 1. String filename = new String(“xx.zip”.getBytes(“UTF-8”), “ISO8859-1”);包装zip文件名不发生乱码.  2.一定要注意 ...

  5. [LINUX] 快速回收连接

    i /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_r ...

  6. Android apk在线升级

    APK 在线升级 APK 在线升级几乎是所有程序必备的功能. 在线升级功能能解决已有的问题并提供更丰富的新功能. 基本的流程是: 检测到新版本信息 弹出升级提示窗口 点击 No 不进行升级,完毕! 点 ...

  7. android -------- RSA加密解密算法

    RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计 ...

  8. index row size 2720 exceeds maximum 2712 for index "xxx" ,Values larger than 1/3 of a buffer page cannot be indexed.

    记录一个bug情况: 我有个表NewTable,复合主键(slaveid,resid,owner) CREATE TABLE "public"."NewTable&quo ...

  9. C语言 宽字符串

    /* 宽字符串的打印 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...

  10. PHP 相关性系数计算

    相关系数公式 参考:https://baike.baidu.com/item/相关系数 PHP 实现代码 public static function calc($list) { $cv = []; ...