2013-06-13 6 views
10

정확하게이 메서드를 사용해야합니다. JedisConnectionException, JedisDataException 또는 JedisException에 대한 예외입니다. 제 지식에 대한 좋은 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를 차단해야합니까? 리소스를 두 번 반환하는 데 문제가 발생합니까? –

1

샘플 코드!

returnBrokenResource(), returnResource()은 더 이상 사용되지 않습니다. finally 블록에 jedis.close()을 안전하게 사용하십시오.

Jedis 풀에서 빌려온 경우
finally { 
    if (jedis != null) { 
    jedis.close(); 
    } 
} 

, 이미 JedisConnectionException 발생 있었다 결정하기 때문에 적당한 방법으로 풀에 반환한다. Jedis가 수영장에서 빌린 것이 아니라면 연결이 끊어지고 닫힙니다.

7

에 따라 이에 대한