Jedis - Когда использовать returnBrokenResource()
Когда именно мы должны использовать этот метод. On 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);
}
Ответы
Ответ 1
Предполагается использовать returnBrokenResource, когда состояние объекта невосстановимо. Объект Jedis представляет соединение с Redis. Он становится непригодным, когда физическое соединение нарушено или когда синхронизация между клиентом и сервером теряется.
С Jedis эти ошибки представлены исключением JedisConnectionException. Поэтому я бы использовал returnBrokenResource для этого исключения, а не для других.
JedisDataException больше связано с плохим использованием Jedis API или ошибками Redis на стороне сервера.
JedisException для всего остального (обычно возникает после ошибки нижнего уровня, независимой от Jedis).
Ответ 2
Для опоздавших!
returnBrokenResource(), returnResource() устарели. Просто используйте jedis.close() в безопасном блоке.
finally {
if (jedis != null) {
jedis.close();
}
}
Если Jedis был заимствован из пула, он будет возвращен в пул с правильным методом, поскольку он уже определяет, что произошло исключение JedisConnectionException. Если Джедис не заимствован из пула, он будет отключен и закрыт.
Ответ 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);
}
}
}