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.csdn.net/bbirdsky/article/details/37602673
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jedis 是一个流行的 Redis Java 客户端库,它提供了与 Redis 服务器进行交互的 API。当使用 Jedis 进行操作时,可能会遇到 "socket timeout" 异常,这种异常通常发生在 Redis 连接超时或者 Redis 服务器响应缓慢的情况下。 为了解决这个问题,你可以考虑以下几个方面: 1. 增加连接超时时间:可以通过设置 `JedisPoolConfig` 的 `setConnectionTimeout` 方法来增加连接超时时间。例如,将连接超时时间设置为 5000 毫秒: ``` JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setConnectionTimeout(5000); JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379); ``` 2. 增加读取超时时间:可以通过设置 `JedisPoolConfig` 的 `setSoTimeout` 方法来增加读取超时时间。例如,将读取超时时间设置为 5000 毫秒: ``` JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setSoTimeout(5000); JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379); ``` 3. 检查 Redis 服务器是否正常运行:可以使用 Redis 的命令行工具来检查 Redis 服务器是否正常运行。例如,使用 `redis-cli` 命令检查 Redis 服务器是否能够正常响应: ``` $ redis-cli ping PONG ``` 4. 调整 Redis 服务器配置:可以考虑调整 Redis 服务器的配置来提高性能和响应速度。例如,可以增加 Redis 的最大内存限制、减少 Redis 的最大连接数等。 总的来说,"socket timeout" 异常通常是由于 Redis 连接超时或者 Redis 服务器响应缓慢导致的。通过增加连接超时时间、增加读取超时时间、检查 Redis 服务器是否正常运行、调整 Redis 服务器配置等方式,可以有效地解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值