记redis⼀次Couldnotgetaresourcefromthepool异常的解决过程
最近有个项⽬中的redis每天都会报 "Could not get a resource from the pool"的错误,⽽这套代码在另⼀地⽅部署⼜没有问题。⼀直不到错误原因。按字⾯意思是连接池中资源不够。
1. 有可能是并发太⾼⽽连接池太⼩,尝试修改连接池上限来解决问题,修改⽅法如下:
<!-- redis连接池的配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${dis.maxTotal}"/>
<property name="maxIdle" value="${dis.maxIdle}"/>
<property name="minIdle" value="${dis.minIdle}"/>
<property name="testOnBorrow" value="${stOnBorrow}"/>
<property name="testOnReturn" value="${stOnReturn}"/>
</bean>
修改 maxTotal 到 60 100 300,可以改变连接池⼤⼩
将连接池上限修改到很⼤,运⾏后发现还是没有解决,仍然报错,有时还会报 "clusterdown the cluster is down"。将maxIdle与minIdle 调⼤,也是⼀样没有效果。
2. 有⽹友说有可能是redis连接没有被释放,连接池设再⼤也没⽤。项⽬使⽤了spring-data-redis,按理释放是不需要⾃⼰处理的,项⽬使⽤的配置如下:
<bean id="redisTemplate" class="org.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,所以不需要⼿动释放连接。
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集⽅法如下:
springframework事务利⽤redis-cli命令进⾏远程检查
redis-cli -h 127.0.0.1 -p 9000
// 连接成功如果设置了密码,需要运⾏命令 auth xxx xxx为密码
运⾏ cluster info 检查
执⾏结果,集正常
xxx:9000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:187
cluster_my_epoch:186
cluster_stats_messages_sent:111466490
cluster_stats_messages_received:111459674
(1.53s)
集没问题,但总会偶尔连不上,因为把做了3个节点(redis与mysql装在同⼀台服务器上),全连不上的机率不⼤,所以最⼤的可能就是服务器或者服务器的⽹络出问题,造成"Too many Cluster redirections"这个错误的发⽣。
最后通过观察发现出错的规律,当mysql在执⾏⼀个很耗时的存储过程CPU⾼得飞起时,就很容易出现报错的情况。最终基本确定是服务器突然卡引起的异常,所以才会⼀会正常偶尔⼜会报错。
经过⼀天的验证与解决,出现"Could not get a resource from the pool"进的解决⽅法总结如下:
1. 参数问题,有可能是连接池太⼩引起
2. jedis版本问题引起
3.服务器性能引起
最终把redis移到另⼀台服务器上,问题解决。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论