Jedis连接池泄漏问题-NoSuchElementException
发布网友
发布时间:2024-10-01 19:00
我来回答
共1个回答
热心网友
时间:2024-10-17 16:34
2022年4月9日,线上A系统频繁报出RedisConnectionFailureException,导致pod频繁重启。问题的堆栈信息显示从Jedis连接池中无法获取资源,所有依赖于Redis的操作均抛出异常。问题的初步定位是Jedis连接池的泄露问题。核心包版本的检查表明,瞬时峰值流量远未达到1000的阈值,因此瞬时流量过大不是导致问题的原因。进一步分析,发现项目中操作Redis存在三种不同的用法:自封装RedisComponent,注入RedisTemplate;自封装RedisTool,用于分布式锁实现;自封装Stock模块,进行库存缓存增减。对这三种用法进行了逐一排查,发现均在finally块中实现了Jedis的关闭,因此排除了这三种用法导致连接池泄露的风险。
在排查过程中,发现该方案上线一天后,线上再次报出相同错误,这排除了流量过大导致的问题。进一步分析,发现操作Redis的三种不同用法中,只有Stock模块使用了lua脚本进行库存缓存的增减,虽然在close方法中并未保证最终执行,但并未在日志中发现与此相关的错误信息。因此,认为Stock模块的问题并非直接导致连接池泄露的原因。
对于连接池泄露的问题,经过深入分析,发现问题可能出在Jedis连接池的参数配置上,特别是max-active和max-wait参数。在检查了四参数的默认配置后,发现与前两次参数对比,问题可能出在max-active和max-wait的配置上。在进一步分析Jedis连接池的操作流程后,发现关键点在于获取连接和归还连接时的线程安全问题。在2.10.2版本的Jedis中,此问题得到了修复。通过线上JVM的dump文件分析,发现未配置四参数时,并未使用池化资源,进一步佐证了问题出在参数配置上。最终的解决方案是将Jedis版本升级至2.10.2,以解决连接池泄露的问题。