出現異常: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); } }