【问题标题】:Jedis - When to use returnBrokenResource()Jedis - 何时使用 returnBrokenResource()
【发布时间】:2013-06-09 13:10:39
【问题描述】:

我们应该在什么时候使用这种方法。在 JedisConnectionException、JedisDataException 或任何 JedisException 上。据我所知,Jedis 没有好的 API 文档。

try {
    Jedis jedis = JedisFactory.getInstance();
    Pipeline pipe = jedis.pipelined();
    Response<Set<Tuple>> idWithScore = pipe.zrangeWithScores(cachekey, from, to);
    **// some statement which may cause some other exception**
    Response<String> val = pipe.get(somekey);
    pipe.exec();
    pipe.sync();
}catch (JedisConnectionException e) {
    JedisFactory.returnBrokenResource(jedis);
}catch(Exception e){
    **// What API I should use here?, how to find whether to use returnBrokenResource(jedis) or returnResource(jedis)**
}finally{
    JedisFactory.returnResource(jedis);
}

【问题讨论】:

    标签: java exception redis jedis


    【解决方案1】:

    对于迟到者!

    returnBrokenResource()、returnResource() 已弃用。只需在 finally 中安全地使用 jedis.close() 即可。

    finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    

    如果 Jedis 是从池中借用的,它将以适当的方法返回到池中,因为它已经确定发生了 JedisConnectionException。如果 Jedis 不是从池中借来的,它将断开连接并关闭。

    【讨论】:

    • 你在哪里找到这方面的文档?
    【解决方案2】:

    当对象的状态不可恢复时,您应该使用 returnBrokenResource。 Jedis 对象表示与 Redis 的连接。当物理连接中断,或者客户端和服务器之间的同步丢失时,它会变得不可用。

    对于 Jedis,这些错误由 JedisConnectionException 表示。所以我会为这个异常使用 returnBrokenResource,而不是其他的。

    JedisDataException 更多与 Jedis API 的错误使用或服务器端 Redis 错误有关。

    JedisException 适用于其他所有情况(通常在较低级别的错误之后引发,独立于 Jedis)。

    【讨论】:

    【解决方案3】:

    根据 jedis 文档的示例代码

    public String get(String keyName)
    {
        Jedis redis = null;
        try
        {
            redis = redisPool.getResource();
            return redis.get(keyName);
        }
        catch (JedisConnectionException e) 
        {
            if (redis != null) 
            {
                redisPool.returnBrokenResource(redis);
                redis = null;
            }
            throw e;
        }
        finally
        {
            if (redis != null)
            {
                redisPool.returnResource(redis);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2022-10-01
      • 2018-09-06
      • 2016-02-23
      • 2013-02-06
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多