出現異常:java.util.NoSuchElementException: Timeout waiting for idle object
出現原因是:不應該在try中釋放資源,而應該在finally中處理。在try中釋放資源,每當出現一次異常將會導致一個jedis對象無法釋放,pool池中可用的jedis對象資源會越來越少。終於將會導致java.util.NoSuchElementException: Timeout waiting for idle object。
這樣的問題是一個慢性問題,需要時間積累才會出現。因為請求無法獲取空暇對象,頁面會出現服務端500錯誤。
try{
jedis = pool.getResource();
// xxx 業務代碼
// 原來代碼:pool.returnResource(jedis);
// 應該放在finally塊中,否則每次發生異常將導致一個jedis對象沒有被移除
}catch(RuntimeException e){
if(jedis != null ) {
// 獲取連接失敗時,應該返回給pool,否則每次發生異常將導致一個jedis對象沒有被回收
pool.returnBrokenResource(jedis);
}
}finally{
// 正確釋放資源
if(jedis != null ) {
pool.returnResource(jedis);
}
}
