前端時間到客戶那去進行項目的上線測試,將項目部署好之后,運行都是正常的,可是每到了第二天早上訪問的時候,就會報一個Could not open Hibernate session for transaction 異常,Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception,當時很摸不着頭腦,后來就開始從數據庫連接的源頭開始找,本次項目中用的是c3p0連接池,並將其交給了spring管理,所以在配置文件中配置了一些數據庫連接的必要屬性,數據庫驅動、數據庫url、用戶名和密碼等,但是總感覺問題出在這,c3p0通過這些配置竟然第一次訪問不到數據庫,在通過一番查閱資料之后,了解到mysql經過28800秒也就是8小時之后會將所有的空閑連接關閉,而c3p0經過6000000秒才會斷開連接,所以很有可能出現mysql的連接已經關掉了,而c3p0還沒有保持着連接,所以每次過完8小時訪問之后,通過c3p0去訪問的時候,c3p0還處於正常連接狀態則會去直接請求打開事務然后訪問數據庫,而此時的數據庫已經關閉,自然就出現了Hibernate不能打開session的異常。
解決辦法是在配置文件中加入:
<!-- 使c3po每隔28000檢查已有的連接是否可用 --> <property name="idleConnectionTestPeriod" value="28000"></property> <!-- 最大空閑時間,超過空閑時間的連接將被丟棄。為0或負數則永不丟棄。默認為0 --> <property name="maxIdleTime" value="28000"></property> <property name="preferredTestQuery" value="測試連接數據庫的sql語句"></property> ----比如select * from systemInfo;
