mysql的空閑8小時問題
阿新 • • 發佈:2017-12-01
連接 小時 mysq rac rdquo eid interact 關閉 ebe
在spring中配置數據源時,必須設定destroy-method="close"屬性,以便spring容器關閉時,數據源能正常關閉。
如果數據庫時mysql,如果數據源配置不當,則可能發生經典的“8小時問題”。原因是mysql在默認情況下如果發現一個連接的空閑時間超過8小時,會在數據庫端自動關閉這個連接。而數據源不知道這個連接已經被數據庫關閉,當他將這個“空閑”的連接交給DAO時,DAO就會報無法獲取connection的異常。
如果采用DBCP默認配置,testOnBorrow屬性默認值為true,數據源在將連接交給DAO前,會檢測這個連接是否是正常的,如果有問題,會再取一個連接,所以不會有8小時問題。如果每次在交給DAO時都檢測連接的有效性,則會再高並發時造成性能問題,因為這造成了更多的數據庫訪問請求。
另一種方式是:將testOnBorrow設置為false,而將testWhileIdle設置為true,再設置timeBetweenEvictionRunsMillis值。這樣,DBCP會通過一個後臺線程定時對空閑連接進行檢測,當發現無用的空閑連接時,會將他們清除掉。只要將timeBetweenEvictionRunsMillis設置為小於8小時,那些被mysql關閉的空閑連接就可以被清除出去,從而避免“8小時問題”。
也可以設置mysql本身的interactive-timeout配置參數,更改空閑連接過期時間。在設置timeBetweenEvictionRunsMillis時,需要知道mysql的空閑連接最大過期時間
mysql的空閑8小時問題