2013-06-13 13 views
10

正確にこのメソッドを使用する必要があります。 JedisConnectionException、JedisDataExceptionまたはJedisExceptionの場合私の知る限り、JedisのAPIドキュメントはありません。Jedis - returnBrokenResource()を使用する場合

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); 
} 

答えて

9

オブジェクトの状態が回復不可能な場合、returnBrokenResourceを使用することになっています。 JedisオブジェクトはRedisへの接続を表します。物理的な接続が切断されたり、クライアントとサーバーの間の同期が失われたりすると、使用できなくなります。

Jedisでは、これらのエラーはJedisConnectionExceptionで表されます。だから私はこの例外のためのreturnBrokenResourceを使用し、他のものは使用しません。

JedisDataExceptionは、Jedis APIの不適切な使用、またはサーバー側のRedisエラーに関連しています。

JedisExceptionは他のすべてのものです(通常、Jedisから独立した低レベルのエラーの後に発生します)。 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); 
     } 
    } 
} 
+0

JedisのAPIドキュメントはありますか?APIをよりよく理解してください。 – user1182253

+0

いいえ - 一般的に、私はhttps://github.com/xetorthio/jedis/tree/master/src/test/java/redis/clients/jedis/testsで提供されている例を使用しています。ソースコード。 –

+6

私はJedisConnectionExceptionとreturnBrokenResourceをキャッチします。私はまだreturnResourceをブロックする必要がありますか?リソースを2回返すのに問題はありますか? –

1

サンプルコード!

returnBrokenResource()、returnResource()は推奨されていません。最終的に安全にブロックするには、jedis.close()を使用してください。

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

Jedisがプールから借りていた場合、それはすでにJedisConnectionExceptionが発生があった決定するので、適切な方法でプールに戻されます。ジェディスがプールから借りていない場合、それは切断され、閉鎖されます。

7

あたり、このため

関連する問題