首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Sleep 連接過多問題排查與解決:wait_timeout 配置最佳實踐

     編輯:MySQL 資料庫相關知識

現象

SHOW PROCESSLIST 大量 Command=Sleep 進程,佔用連接數導致「Too many connections」。

Sleep 進程示例

三大成因

  1. 客戶端未調用 mysql_close():程式碼疏漏、連接池未正確歸還
  2. 閒置超時未達標:客戶端在 wait_timeout/interactive_timeout 內無請求,但連接實際已斷(網絡故障、防火牆切斷),伺服器不知情
  3. 請求未完成客戶端退出:發送查詢前進程崩潰,TCP 半開連接

解決方案

1. 調小 wait_timeout(核心)

-- 配置文件 [mysqld] 區段
wait_timeout = 600  -- 10 分鐘,視業務調整

-- 或動態生效(僅影響新連接)
SET GLOBAL wait_timeout = 600;

2. 應用層強制關閉

  • PHP:mysqli_close()、PDO 設定 ATTR_PERSISTENT=false
  • Java:連接池 minEvictableIdleTimeMillis、testWhileIdle=true
  • Python:with conn.cursor() 上下文管理器

3. 連接池驗證機制

# HikariCP 範例
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=600000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=60000

互動式與非互動式超時區別

啟動時若為互動式客戶端,實際生效值取 interactive_timeout;否則取 wait_timeout。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數適用場景建議值
interactive_timeoutmysql 命令行、GUI 工具28800 (8h)
wait_timeout應用程式、腳本、API600 (10min)