首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 8 小時空閒斷線問題根治:wait_timeout 永久解決方案

     編輯:MySQL 資料庫相關知識

現象

應用啟動後建立資料庫連線,超過 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 前版本有效**,新版驅動已移除此行為,不可依賴。

正確方案(三選一)

  1. 調大伺服器端超時(最簡單):
    
    # my.cnf / my.ini [mysqld]
    wait_timeout = 288000   # 80 小時
    interactive_timeout = 288000
    
    或啟動參數:mysqld --wait_timeout=288000
  2. 客戶端連線池啟用驗證查詢(標準做法):
    
    # HikariCP 範例
    validationTimeout=5000
    connectionTestQuery=SELECT 1
    idleTimeout=300000  # 5 分鐘驗證一次
    
    定期執行輕量查詢保持連線存活,並偵測斷線自動重建。
  3. 應用層捕獲異常重試:捕獲 CommunicationsException / SQLException("Connection closed") 後重新獲取連線。

最佳實踐組合

伺服器端設大數值(如 24-48 小時)+ 客戶端連線池 5-10 分鐘驗證一次,雙重保險,兼顧長連線穩定與資源釋放。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved