應用程式啟動後一段時間(預設 8 小時 = 28800 秒)未使用資料庫連線,再次操作報錯:
Communications link failure
The last packet successfully received from the server was X milliseconds ago...
原因:MySQL 5.x 修改了閒置連線處理機制,超時後伺服器主動斷開,舊版驅動的自動重連(Reconnect)機制失效。
編輯 my.cnf / my.ini [mysqld] 區段:
[mysqld]
wait_timeout = 604800 # 7 天(秒)
interactive_timeout = 604800 # 互動式客戶端同步調整
重啟 MySQL 生效。驗證:SHOW VARIABLES LIKE 'wait_timeout';
缺點:長連線佔用資源,若連線洩漏會耗盡 max_connections。
| 框架/語言 | 關鍵設定 |
|---|---|
| HikariCP (Java) | maximumPoolSize、idleTimeout(< wait_timeout)、connectionTimeout、validationTimeout、leakDetectionThreshold |
| Druid (Java) | validationQuery、testWhileIdle、timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis |
| Go database/sql | SetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetime(< wait_timeout) |
| Python SQLAlchemy | pool_recycle(< wait_timeout)、pool_pre_ping=True |
| PHP PDO | 啟用 ATTR_PERSISTENT 謹慎使用;建議短連線模式 + 重試邏輯 |
| Node.js mysql2 | waitForConnections、connectionLimit、maxIdleTime、enableKeepAlive |