首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

高效使用 ADO.NET Connection 物件:try-catch-finally 與 using 區塊最佳實務

     編輯:關於.NET

常見問題

本地測試正常,部署到伺服器有併發時出現「連線未關閉」、「連線池耗盡」錯誤。根因:Connection 未在異常情況下正確關閉/釋放。

模式一:try-catch-finally 確保關閉

var conn = new SqlConnection(connStr);
try {
    conn.Open();
    // 執行命令...
}
catch (SqlException ex) {
    // 記錄錯誤日誌
}
finally {
    if (conn.State == ConnectionState.Open) conn.Close(); // 必須在 finally
}

優點:可捕捉異常並記錄。缺點:樣板碼多,易忘寫 finally。

模式二:using 區塊自動釋放(推薦)

using (var conn = new SqlConnection(connStr)) {
    conn.Open();
    // 執行命令...
} // 區塊結束自動呼叫 conn.Dispose() → 關閉連線並歸還連線池
  • SqlConnection 實作 IDisposable,using 編譯為 try/finally + Dispose()。
  • 不論正常返回、拋出異常、break/return 跳出,必定執行 Dispose。

最佳組合:using + try-catch

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」習慣,是預防連線洩漏、連線池耗盡的最簡單有效手段。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved