當應用出現 Too many connections 錯誤,表示所有可用連接已被佔用。本文提供從配置調整、應用層優化到引擎參數微調的完整解決路徑。
max_connections = 100 過低,無法支撐並發請求。[mysqld] max_connections = 1000
建議值:500~1000(視記憶體與負載)。修改後**必須重啟 MySQL** 生效:
net stop mysql net start mysql
mysqld --max_connections=1000
max_connections + 1 連接,額外 1 個保留給擁有 SUPER 權限的管理員,便於連線執行 SHOW PROCESSLIST 排查。maximumPoolSize、idleTimeout、maxLifetime。@Transactional,確保連接在事務邊界正確獲取與釋放,避免手動管理導致洩漏。maxActive、maxIdle、minIdle、maxWait 配合資料庫 max_connections 設定,預留管理員連接。SHOW PROCESSLIST; -- 查看當前連接狀態 SHOW VARIABLES LIKE 'max_connections'; -- 確認當前生效值 SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep'; -- 過濾非睡眠連接
若同步調整 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 後無法啟動的解決步驟:
net stop mysqlib_logfile0, ib_logfile1 ...net start mysql原因:Redo Log 檔案大小與配置不符,MySQL 拒絕啟動以防資料損壞。
max_connections 已調大並重啟生效max_connections - 50(預留管理/備份連接)SHOW PROCESSLIST 檢查 Sleep 連接數)long_query_time + slow_query_log)