Mysql經典的「8小時問題」

2021-07-05 11:03:17 字數 720 閱讀 6959

mysql 的預設設定下,當乙個連線的空閒時間超過8小時後,mysql 就會斷開該連線,而 c3p0 連線池則以為該被斷開的連線依然有效。

假設你的資料庫是mysql,如果資料來源配置不當,將可能發生經典的「8小時問題」。原因是mysql在預設情況下,如果發現乙個連線的空閒時間超過8小時,將會在資料庫端自動關閉這個連線。而資料來源並不知道這個連線已經關閉了,當它將這個無用的連線返回給某個dao時,dao就會報無法獲取connection異常。

如果採用dbcp的預設配置,由於testonborrow屬性的預設值是true,資料來源在將連線交給dao前,會事先檢測這個連線是否是好的,如果連線有問題(在資料庫端被關閉),則會取乙個其他的連線給dao。所以並不會有「8小時問題」。如果每次將連線交給dao時都檢測連線的有效性,在高併發的應用中將會帶來效能的問題,因為它會需要更多的資料庫訪問請求。

一種推薦的高效的方式是:將testonborrow設定為false,而將「testwhileidle」設定為true,再設定好testbetweenevictionrunsmillis值(小於8小時)。那些被mysql關閉的連線就可以別清除出去,避免「8小時問題」。

當然,mysql本身也能調整interactive-timeout(以秒為單位)配置引數,更改空閒連線的過期時間。所以,在設定timebetweenevictionrunsmmillis值時,必須首先獲知mysql的空閒連線的最大過期時間。

c3p0對於有效連線的檢測,請參照dbcp配置方式。

MySql的8小時問題

如果連線閒置8小時 8小時內沒有進行資料庫操作 mysql就會自動斷開連線,要重啟tomcat。解決辦法 1.使用hibernate c3p0連線池 新增如下配置即可 org.hibernate.dialect.mysqldialect com.mysql.jdbc.driver jdbc mysq...

Mysql連線 8小時問題

mysql預設設定當乙個連線的空閒時間超過8h,mysql就會自動斷開該連線,而連線池仍認為該連線有效。此情況下,若客戶端向連線池請求連線的話,連線池就會把已經失效的連線返回給客戶端,此時客戶端使用失效連線時即丟擲異常。解決方法 配置 spring.datasource.validation que...

mysql 8小時問題

假設你的資料庫是mysql,如果資料來源配置不當,將可能發生經典的 8小時問題 原因是mysql在預設情況下,如果發現乙個連線的空閒時間超過8小時,將會在資料庫端自動關閉這個連線。而資料來源並不知道這個連線已經關閉了,當它將這個無用的連線返回給某個dao時,dao就會報無法獲取connection異...