項目線上環境發現:java.util.NoSuchElementException: Timeout waiting for idle objectjava
問題緣由:不該該在try中釋放資源,而應該在finally中處理。雖然是很是基礎的語法,但仍是有可能會寫錯,維護老系統時發現很幾處都存在這種潛在的Bug,引覺得戒。在try中釋放資源,每當出現一次異常將會致使一個jedis對象沒法釋放,pool池中可用的jedis對象資源會愈來愈少,最終將會致使java.util.NoSuchElementException: Timeout waiting for idle object。這種問題是一個慢性問題,須要時間積累纔會發做。服務器
因爲請求沒法獲取空閒對象,頁面會出現服務端500錯誤。若代碼加入循環獲取jedis將還可能出現服務器宕機。spa
try {對象
jedis = pool.getResource();資源
// xxx 業務代碼
// 原來代碼:pool.returnResource(jedis);,應該放在finally塊中,不然每次發生異常將致使一個jedis對象沒有被t
} catch (RuntimeException e) { get
if(jedis != null ) {it
pool.returnBrokenResource(jedis);io
}基礎
} finally{ object
// 正確釋放資源
if(jedis != null ) {
pool.returnResource(jedis);
}
}