jedis异常:NoSuchElementException: Timeout waiting for idle object

项目线上环境发现: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值