生產庫 SHOW PROCESSLIST 顯示大量 Command=Sleep 連接,佔用連接數、消耗內存,甚至觸發 Too many connections。
| 參數 | 含義 | 默認值 | 建議值 |
|---|---|---|---|
interactive_timeout | 交互式客戶端(mysql 命令行等)空閒斷開秒數 | 28800 (8h) | 600 (10min) |
wait_timeout | 非交互式客戶端(應用連接池)空閒斷開秒數 | 28800 (8h) | 300 (5min) |
生效方式:線程啟動時根據客戶端類型(CLIENT_INTERACTIVE 標誌)選擇對應變量初始化會話級 wait_timeout。修改全局變量僅影響新連接。
-- 批量 KILL
SELECT CONCAT('KILL ', id, ';') FROM information_schema.PROCESSLIST
WHERE COMMAND='Sleep' AND TIME > 300;
-- 執行輸出語句
# 核心:閒置連接最大存活時間(秒),超時自動銷毀 hibernate.c3p0.maxIdleTime=300 # 配合:最小連接數設為 0,允許池縮容至空 hibernate.c3p0.minPoolSize=0 # 檢查連接有效性間隔 hibernate.c3p0.idleConnectionTestPeriod=60
原理:池定期檢測閒置連接,超過 maxIdleTime 主動 close() 歸還數據庫,避免服務端累積 Sleep。
conn.close(),無超時自動釋放機制;Threads_connected、Aborted_connects,設置告警;testOnBorrow/testWhileIdle),防止防火牆斬斷導致的僵死連接;wait_timeout ≤ 連接池 idleConnectionTestPeriod,確保池側先於服務端發現失效連接。