项目线上环境发现:java.util.NoSuchElementException: Timeout waiting for idle object
问题原因:不应该在try中释放资源,而应该在finally中处理。虽然是非常基础的语法,但还是有可能会写错,维护老系统时发现很几处都存在这种潜在的Bug,引以为戒。在try中释放资源,每当出现一次异常将会导致一个jedis对象无法释放,
pool池中可用的jedis对象资源会越来越少,最终将会导致java.util.NoSuchElementException: Timeout waiting for idle object。这种问题是一个慢性问题,需要时间积累才会发作。
由于请求无法获取空闲对象,页面会出现服务端500错误。若代码加入循环获取jedis将还可能出现服务器宕机。
try {
jedis = pool.getResource();
// xxx 业务代码
// 原来代码:pool.returnResource(jedis);,应该放在finally块中,否则每次发生异常将导致一个jedis对象没有被t
} catch (RuntimeException e) {
//抄过来的,感觉这里不用处理,finally会处理的
/** if(jedis != null ) {
pool.returnBrokenResource(jedis); // 2.7 或者 3.0 以后废弃
} */
} finally{
// 正确释放资源
if(jedis != null ) {
// pool.returnResource(jedis); // 2.7 或者 3.0 以后废弃
jedis.close();
}
}
附加:jedis.close()源码
public void close() {
if (this.dataSource != null) {
if (this.client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.returnResource(this);
}
} else {
this.client.close();
}
}
参考:
http://blog.youkuaiyun.com/bbirdsky/article/details/37602673