本地測試正常,部署到伺服器有併發時出現「連線未關閉」、「連線池耗盡」錯誤。根因:Connection 未在異常情況下正確關閉/釋放。
var conn = new SqlConnection(connStr);
try {
conn.Open();
// 執行命令...
}
catch (SqlException ex) {
// 記錄錯誤日誌
}
finally {
if (conn.State == ConnectionState.Open) conn.Close(); // 必須在 finally
}
優點:可捕捉異常並記錄。缺點:樣板碼多,易忘寫 finally。
using (var conn = new SqlConnection(connStr)) {
conn.Open();
// 執行命令...
} // 區塊結束自動呼叫 conn.Dispose() → 關閉連線並歸還連線池
SqlConnection 實作 IDisposable,using 編譯為 try/finally + Dispose()。break/return 跳出,必定執行 Dispose。using (var conn = new SqlConnection(connStr)) {
try {
conn.Open();
// 業務邏輯...
}
catch (SqlException ex) {
Log.Error(ex); // 記錄異常
throw; // 視需求重拋或轉換
}
// 無需 finally 手動 Close,using 保證釋放
}
兼具「資源確定性釋放」與「異常處理/記錄」。
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn))
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) { /* ... */ }
} // 三層 using 疊加,層層保證釋放
養成「new SqlConnection() 立即包在 using」習慣,是預防連線洩漏、連線池耗盡的最簡單有效手段。