首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

解決 MySQL SLEEP 連接過多:服務端配置與客戶端連接池雙管齊下

     編輯:MySQL 綜合教學

現象

生產庫 SHOW PROCESSLIST 顯示大量 Command=Sleep 連接,佔用連接數、消耗內存,甚至觸發 Too many connections。

一、服務端:縮短超時自動斷開

關鍵參數

參數含義默認值建議值
interactive_timeout交互式客戶端(mysql 命令行等)空閒斷開秒數28800 (8h)600 (10min)
wait_timeout非交互式客戶端(應用連接池)空閒斷開秒數28800 (8h)300 (5min)

生效方式:線程啟動時根據客戶端類型(CLIENT_INTERACTIVE 標誌)選擇對應變量初始化會話級 wait_timeout。修改全局變量僅影響新連接。

清理現存 Sleep 連接

-- 批量 KILL
SELECT CONCAT('KILL ', id, ';') FROM information_schema.PROCESSLIST
WHERE COMMAND='Sleep' AND TIME > 300;
-- 執行輸出語句

二、客戶端:連接池正確配置

C3P0 關鍵參數

# 核心:閒置連接最大存活時間(秒),超時自動銷毀
hibernate.c3p0.maxIdleTime=300
# 配合:最小連接數設為 0,允許池縮容至空
hibernate.c3p0.minPoolSize=0
# 檢查連接有效性間隔
hibernate.c3p0.idleConnectionTestPeriod=60

原理:池定期檢測閒置連接,超過 maxIdleTime 主動 close() 歸還數據庫,避免服務端累積 Sleep。

無連接池場景

  • 代碼中必須显式 conn.close(),無超時自動釋放機制;
  • 進程結束依賴 GC 回收,不可靠,嚴禁長連接不關閉。

三、架構層面建議

  1. 統一接入連接池(HikariCP/Druid/C3P0),禁用裸連接;
  2. 監控 Threads_connected、Aborted_connects,設置告警;
  3. 應用端啟用連接有效性檢查(testOnBorrow/testWhileIdle),防止防火牆斬斷導致的僵死連接;
  4. 服務端 wait_timeout ≤ 連接池 idleConnectionTestPeriod,確保池側先於服務端發現失效連接。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved