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

解決 MySQL "Too many connections" 錯誤的完整方案

     編輯:MySQL 資料庫相關知識

當應用出現 Too many connections 錯誤,表示所有可用連接已被佔用。本文提供從配置調整、應用層優化到引擎參數微調的完整解決路徑。

錯誤原因

  • 預設 max_connections = 100 過低,無法支撐並發請求。
  • 應用程式未正確釋放連接(連接洩漏),導致連接池耗盡。
  • 長時間執行的查詢佔用連接不釋放。

核心解決方案:調大 max_connections

方法一:修改配置檔 (my.cnf / my.ini)

[mysqld]
max_connections = 1000

建議值:500~1000(視記憶體與負載)。修改後**必須重啟 MySQL** 生效:

net stop mysql
net start mysql

方法二:啟動參數指定(臨時測試)

mysqld --max_connections=1000

官方文檔說明重點

  • 實際允許 max_connections + 1 連接,額外 1 個保留給擁有 SUPER 權限的管理員,便於連線執行 SHOW PROCESSLIST 排查。
  • Linux/Solaris 可支撐 500~1000 並發(視記憶體),MySQL 官方靜態編譯版最高達 4000。

應用層優化(治本)

  1. 啟用連接池:Java 使用 HikariCP / Druid,設定合理的 maximumPoolSize、idleTimeout、maxLifetime。
  2. 配置 Spring 事務管理:對批量 INSERT/UPDATE 加上 @Transactional,確保連接在事務邊界正確獲取與釋放,避免手動管理導致洩漏。
  3. 縮短連接持有時間:取得連接 → 執行 SQL → 立即關閉,不要在業務邏輯處理中長時間持有連接。
  4. Tomcat 連接池調整:maxActive、maxIdle、minIdle、maxWait 配合資料庫 max_connections 設定,預留管理員連接。

進階排查指令

SHOW PROCESSLIST;                 -- 查看當前連接狀態
SHOW VARIABLES LIKE 'max_connections';  -- 確認當前生效值
SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep';  -- 過濾非睡眠連接

InnoDB 參數優化實例(附帶避坑)

若同步調整 InnoDB 參數,需注意 innodb_log_file_size 變更後的重啟流程:

innodb_buffer_pool_size=768M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=0
innodb_thread_concurrency=20

修改 innodb_log_file_size 後無法啟動的解決步驟:

  1. net stop mysql
  2. 刪除 data 目錄下舊的 ib_logfile0, ib_logfile1 ...
  3. net start mysql

原因:Redo Log 檔案大小與配置不符,MySQL 拒絕啟動以防資料損壞。

檢查清單

  • [ ] max_connections 已調大並重啟生效
  • [ ] 應用連接池大小 ≤ max_connections - 50(預留管理/備份連接)
  • [ ] 無長連接洩漏(定期 SHOW PROCESSLIST 檢查 Sleep 連接數)
  • [ ] 慢查詢已優化(long_query_time + slow_query_log)
  • [ ] 監控告警:連接使用率 > 80% 觸發告警
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved