啓動報Cannot get connection for url jdbc xxxx listener could not hand off client co

剛開始碰到這個錯誤的時候一頭霧水 雖說錯誤原因很明顯 就是數據庫獲取不到連接了。查看發現無法從連接池獲取連接,連接已經達到最大數。
但是算來算去,感覺不太可能達到最大連接數,因爲程序剛啓動,雖說程序中使用了多個數據源,每個都有一個連接池,但分配的初始大小都是10,算來算去也就幾十個連接數。不可能達到Oracle設置的最大連接數150。但查看數據庫連接數發現,確實連接數達到了最大值。想了半天想不明白。因爲都是自己在調試程序,沒有別人在同時使用。而且是在啓動的時候就報錯了,然而並沒有查詢數據或別的什麼需要獲取多個連接的操作。再說即使真達到了最大連接,但是我重啓tomcat按理說應該連接就釋放了呀。
就想呀想呀,感覺又要懷疑世界,懷疑人生了,後來與同事討論,突然有一個思路,是不是在調試的時候,每次都是直接殺死tomcat的進程,連接池的連接可能並沒有釋放掉。這樣Oracle那邊就還保持着這個連接的會話。由於調試期間又是頻繁啓動殺死tomcat,這樣慢慢的積累,Oraclle裏的連接越來越多而且都沒有釋放,因爲還沒到超時時間。然後在一次的啓動中,幾個連接池再申請十幾二十個連接的時候,就會超過了數據庫的最大連接數,這樣就成了導致程序啓動失敗的最後一根稻草。
有了這個想法後,懷着激動的心情就開始實驗驗證,把數據庫重啓,釋放多餘的連接,把兩個數據源的數據連接池的初始大小都改爲50,然後啓動,第一次啓動成功,這是查詢數據庫的連接數,發現在120個左右。這是直接殺死tomcat的進程,再次查看連接數,發現還是120個左右,說明連接並沒有釋放。這時再次啓動tomcat就會報錯,因爲這次剩餘的連接數已經不夠連接池申請的了。驗證正確。
後來又把連接池的初始大小改小,發現直接停tomcat並不是每次Oracle的連接都不釋放,有的時候tomcat直接停掉後,連接就會釋放掉了。教給大家一個測試方法,在tomcat啓動後斷開網絡,然後再停掉tomcat,這樣與Oracle的連接就不會釋放掉,就可以測試了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章