2013-06-13 12 views
10

Khi nào chính xác chúng ta nên sử dụng phương pháp này. Trên JedisConnectionException, JedisDataException hoặc cho bất kỳ JedisException nào. Không có tài liệu API tốt cho Jedis cho kiến ​​thức của tôi.Jedis - Khi nào sử dụng 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); 
} 

Trả lời

9

Bạn có nghĩa vụ phải sử dụng returnBrokenResource khi trạng thái của đối tượng không thể khôi phục. Một đối tượng Jedis đại diện cho một kết nối với Redis. Nó trở nên không sử dụng được khi kết nối vật lý bị hỏng hoặc khi việc đồng bộ hóa giữa máy khách và máy chủ bị mất.

Với Jedis, các lỗi này được đại diện bởi JedisConnectionException. Vì vậy, tôi sẽ sử dụng returnBrokenResource cho ngoại lệ này, và không phải là những cái khác.

JedisDataException có liên quan nhiều hơn đến việc sử dụng sai API Jedis hoặc lỗi Redis phía máy chủ.

JedisException dành cho mọi thứ khác (thường được nêu ra sau một lỗi cấp thấp hơn, độc lập với Jedis).

+0

Có tài liệu API nào cho Jedis hay không, để hiểu các API tốt hơn. – user1182253

+0

Không - nói chung, tôi sử dụng các ví dụ được cung cấp trong https://github.com/xetorthio/jedis/tree/master/src/test/java/redis/clients/jedis/tests - khi tôi bị kẹt, tôi nhìn vào mã nguồn. –

+6

Cho phép nói rằng tôi bắt JedisConnectionException và returnBrokenResource. Tôi có nên vẫn còn trong khối returnResource cuối cùng? Nó sẽ gây ra bất kỳ rắc rối nào trả về tài nguyên hai lần? –

1

mẫu mã cho điều này theo jedis tài liệu

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

Đối với những người đến muộn!

returnBrokenResource(), returnResource() không còn được dùng nữa. Chỉ cần sử dụng jedis.close() cuối cùng là chặn an toàn.

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

Nếu Jedis được mượn từ hồ bơi, nó sẽ được trả lại cho hồ bơi với phương pháp thích hợp vì nó đã xác định là có JedisConnectionException xảy ra. Nếu Jedis không được vay mượn từ hồ bơi, nó sẽ bị ngắt kết nối và đóng cửa.

Các vấn đề liên quan