長時間閒置的連線(預設 8 小時 = 28800 秒)會被 MySQL 主動關閉,應用再次使用該連線時拋出 Communications link failure 或 MySQL server has gone away。
SHOW VARIABLES LIKE '%timeout%';
關鍵變數:
wait_timeout:非互動式連線閒置超時(預設 28800 秒)。interactive_timeout:互動式客戶端閒置超時。net_read_timeout/net_write_timeout:網絡讀寫超時。SHOW PROCESSLIST;
Time 欄顯示該連線已閒置秒數。若持續增長超過 wait_timeout,連線將被斷開。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 增大 wait_timeout(如 31536000=1年) | 簡單,無需改代碼 | 佔用連線資源,掩蓋洩漏風險 | 臨時緩解、低併發內部系統 |
| 連線池配置 testOnBorrow / testWhileIdle | 自動檢測失效連線、重建 | 需框架支援(HikariCP, Druid, DBCP2) | 生產環境標準做法 |
| 應用層定時發送 SELECT 1 保活 | 不依賴連線池 | 需額外排程、增加負載 | 無連線池的舊系統 |
| 使用驅動自動重連屬性(autoReconnect=true) | 透明重連 | 官方不推薦,可能導致事務不一致 | 極少數只讀非事務場景 |
validationTimeout、idleTimeout、maxLifetime、minimumIdle。SELECT 1,testWhileIdle=true、timeBetweenEvictionRunsMillis 設定合理(如 30 秒)。Threads_connected、Aborted_connects、Connection_errors_internal 等指標。單純調大 wait_timeout 治標不治本。**連線池驗證 + 應用重試** 才是生產環境穩健之道。