MySQL 5.x 預設 wait_timeout=28800(8 小時)。連線空閒超過此值,Server 主動斷開。應用端連線池若無驗證機制,再次借用該連線時拋出 Communications link failure 或 MySQL server has gone away,導致業務報錯。
| 框架/池 | 配置關鍵字 | 範例值 |
|---|---|---|
| HikariCP | connectionTestQuery | SELECT 1 |
| Druid | validationQuery | SELECT 1 |
| DBCP2 | validationQuery | SELECT 1 |
| Tomcat JDBC | validationQuery | SELECT 1 |
同時設定 testOnBorrow=true、testWhileIdle=true、timeBetweenEvictionRunsMillis=30000,確保借用前、空閒檢查時均驗證連線有效性。
[mysqld]
wait_timeout=604800 # 7 天
interactive_timeout=604800
# 或啟動參數
mysqld --wait_timeout=604800
修改後 SHOW VARIABLES LIKE 'wait_timeout'; 驗證生效。注意:過長會導致殭屍連線佔用 max_connections,需配合方案一清理。
僅在極舊系統無法升級連線池、無法修改 DB 參數時作為臨時彌補。
若必須重啟,請在業務低峰期(如 03:00),並確保:
FLUSH LOGS、SET GLOBAL innodb_fast_shutdown=1-- 確認當前 wait_timeout
SHOW VARIABLES LIKE 'wait_timeout';
-- 監控 Aborted_clients / Aborted_connects
SHOW GLOBAL STATUS LIKE 'Aborted_%';
-- 持續增長說明連線異常斷開頻繁
**根治之道在應用層:連線池必須驗證連線有效性**。wait_timeout 僅是輔助緩衝。將 validationQuery=SELECT 1、testOnBorrow=true 納入基礎設施代碼(IaC)標準模板,新專案上線即合規,徹底消除「空閒一夜、早晨業務崩潰」的經典事故。