應用啟動後建立資料庫連線,超過 8 小時無活動,再次使用拋出:
Communications link failure due to underlying exception:
java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully...
MySQL 預設 wait_timeout = 28800 秒(8 小時),interactive_timeout 同值。非互動連線(JDBC、連線池)閒置超時即被伺服器主動斷開,客戶端連線池若無驗證機制將持有失效連線。
連線字串加 autoReconnect=true **僅對 MySQL 4.x 前版本有效**,新版驅動已移除此行為,不可依賴。
# my.cnf / my.ini [mysqld]
wait_timeout = 288000 # 80 小時
interactive_timeout = 288000
或啟動參數:mysqld --wait_timeout=288000
# HikariCP 範例
validationTimeout=5000
connectionTestQuery=SELECT 1
idleTimeout=300000 # 5 分鐘驗證一次
定期執行輕量查詢保持連線存活,並偵測斷線自動重建。CommunicationsException / SQLException("Connection closed") 後重新獲取連線。伺服器端設大數值(如 24-48 小時)+ 客戶端連線池 5-10 分鐘驗證一次,雙重保險,兼顧長連線穩定與資源釋放。