2013-06-13 15 views
10

Kiedy dokładnie powinniśmy użyć tej metody. W przypadku wyjątku JedisConnectionException, JedisDataException lub dowolnego wyjątku JedisException. Nie ma dobrej dokumentacji API dla Jedis według mojej wiedzy.Jedi - Kiedy używać 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); 
} 

Odpowiedz

9

Powinieneś użyć returnBrokenResource, gdy stan obiektu jest nieodwracalny. Obiekt Jedis reprezentuje połączenie z Redis. Staje się bezużyteczny, gdy fizyczne połączenie zostanie zerwane lub gdy utracona zostanie synchronizacja między klientem a serwerem.

W przypadku Jedis błędy te są reprezentowane przez wyjątek JedisConnectionException. Więc użyłbym returnBrokenResource dla tego wyjątku, a nie innych.

JedisDataException jest bardziej związany z niewłaściwym używaniem API Jedis lub z błędami Redis po stronie serwera.

Wyjątek JedisException dotyczy wszystkiego innego (zwykle wywoływanego po błędzie na niższym poziomie, niezależnym od Jedisa).

+0

Czy istnieje dokumentacja interfejsu API dla oprogramowania Jedis, aby lepiej zrozumieć interfejsy API. – user1182253

+0

Nie - generalnie używam przykładów podanych na https://github.com/xetorthio/jedis/tree/master/src/test/java/redis/clients/jedis/tests - kiedy utknąłem, zaglądam kod źródłowy. –

+6

Powiedzmy, że łapię JedisConnectionException i returnBrokenResource. Czy nadal powinienem być w końcu bloku returnResource? Czy spowoduje to problemy z dwukrotnym odzyskaniem zasobów? –

1

przykładowy kod do tego, jak na dokumentacji 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); 
     } 
    } 
} 
7

Dla spóźnialskich!

returnBrokenResource(), returnResource() są przestarzałe. Po prostu użyj jedis.close() w końcu blokuj bezpiecznie.

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

Jeśli Jedis została zapożyczona z basenu, zostanie ona zwrócona do basenu z właściwej metody, ponieważ nie było już określa wystąpił JedisConnectionException. Jeśli Jedis nie zostanie pożyczony z puli, zostanie odłączony i zamknięty.

Powiązane problemy