2013-06-13 9 views
10

Quando esattamente dovremmo usare questo metodo. Su JedisConnectionException, JedisDataException o per qualsiasi JedisException. Non c'è una buona documentazione API per Jedis per quanto ne so.Jedis - Quando utilizzare 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); 
} 

risposta

9

Si suppone di utilizzare returnBrokenResource quando lo stato dell'oggetto non è recuperabile. Un oggetto Jedis rappresenta una connessione a Redis. Diventa inutilizzabile quando la connessione fisica è interrotta o quando viene persa la sincronizzazione tra client e server.

Con Jedis, questi errori sono rappresentati da JedisConnectionException. Quindi userei returnBrokenResource per questa eccezione, e non per gli altri.

JedisDataException è più correlato all'utilizzo errato dell'API di Jedis o agli errori di Redis lato server.

JedisException è per tutto il resto (solitamente generato dopo un errore di livello inferiore, indipendente da Jedis).

+0

C'è qualche documentazione API per Jedis, per capire meglio le API. – user1182253

+0

No, in genere, utilizzo gli esempi forniti in https://github.com/xetorthio/jedis/tree/master/src/test/java/redis/clients/jedis/tests - quando sono bloccato, guardo nel codice sorgente. –

+6

Diciamo che prendo JedisConnectionException e returnBrokenResource. Dovrei ancora bloccare finalmente returnResource? Causa qualche problema nel restituire la risorsa due volte? –

1

codice di esempio per questo come per Jedi documentazione

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

Per i ritardatari!

returnBrokenResource(), returnResource() sono obsoleti. Basta usare jedis.close() nel blocco finalmente sicuro.

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

Se Jedis trae spunto dal piscina, sarà restituito alla piscina con metodo corretto poiché determina già era verificato JedisConnectionException. Se Jedis non è stato preso in prestito dal pool, verrà disconnesso e chiuso.

Problemi correlati