项目线上环境发现: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); } }