ERROR 1040 (HY000): Too many connections 是生產環境高頻故障。本文從連接洩漏、連接池配置、架構層面三個維度系統排查根因,給出代碼級修復方案與長效治理策略。
當前活躍連接數 ≥ max_connections(預設 151)。新連接被拒,現有連接繼續工作。
| 根因類別 | 典型表現 | 核心代碼問題 |
|---|---|---|
| 連接洩漏 | 併發低但連接數單調增長 | 無 finally 關閉、using 缺失、異常拋出前未關閉 |
| 連接池配置不當 | 併發高峰突發報錯 | 池大小 < max_connections、無超時回收、驗證查詢失效 |
| 架構反模式 | 長連接單例、靜態連接對象 | static MySqlConnection、單例模式持有連接 |
// 絕對禁止
private static MySqlConnection _conn = new MySqlConnection(connStr);
public IList GetSalesByDate(string date) {
var list = new List();
const string sql = "SELECT id,model,number,brand,sendtime,pubdate,autoinsert_flag,mobilephone " +
"FROM tbl_saledata WHERE autoinsert_flag=0 AND sendtime=@date";
using (var conn = new MySqlConnection(connStr)) { // 每次新建
conn.Open();
using (var cmd = new MySqlCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@date", date); // 參數化防注入
using (var dr = cmd.ExecuteReader()) {
while (dr.Read()) {
list.Add(Populate(dr));
}
} // dr 自動關閉
} // cmd 自動釋放
} // conn 自動關閉並歸還池(若啟用 Pooling)
return list;
}
| 參數 | 建議值 | 說明 |
|---|---|---|
| Pooling | true | 啟用連接池(預設開啟) |
| Min Pool Size | 5-10 | 預熱連接數,避免冷啟動延遲 |
| Max Pool Size | 100-200 | ≤ MySQL max_connections - 預留管理連接 |
| Connection Lifetime | 300 (秒) | 連接最大生存時間,防止長連接殭屍 |
| Connection Timeout | 15-30 | 獲取連接等待超時 |