jedis异常:Timeout waiting for idle object

项目线上环境发现:java.util.NoSuchElementException: Timeout waiting for idle objectjava


问题缘由:不该该在try中释放资源,而应该在finally中处理。虽然是很是基础的语法,但仍是有可能会写错,维护老系统时发现很几处都存在这种潜在的Bug,引觉得戒。在try中释放资源,每当出现一次异常将会致使一个jedis对象没法释放,pool池中可用的jedis对象资源会愈来愈少,最终将会致使java.util.NoSuchElementException: Timeout waiting for idle object。这种问题是一个慢性问题,须要时间积累才会发做。服务器

因为请求没法获取空闲对象,页面会出现服务端500错误。若代码加入循环获取jedis将还可能出现服务器宕机。spa

正确代码以下:code

try {
   jedis = pool.getResource();
   // xxx 业务代码
   // 原来代码:pool.returnResource(jedis);,应该放在finally块中,不然每次发生异常将致使一个jedis对象没有被t
} catch (RuntimeException e) { 
         if(jedis != null ) {
                 pool.returnBrokenResource(jedis);
}} finally{ 
        // 正确释放资源
         if(jedis != null ) {
                pool.returnResource(jedis);
         }
}