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

C# IDataReader 造成的資源洩漏問題與解決方案

     編輯:關於C語言

IDataReader 與 DataSet 的效能比較

在 ADO.NET 中,IDataReader 提供唯讀、順向的資料流存取,適合大量資料讀取;DataSet 則將資料載入記憶體,適合小量資料與離線操作。當資料筆數超過 200 筆(視硬體而定),IDataReader 的效能優勢明顯。

資源洩漏風險

若連線中斷、例外拋出或未正確關閉,IDataReader 可能導致資料庫連線池洩漏。.NET 限制連線池大小(WinApp 約 21、Web 更少),洩漏會迅速耗盡可用連線。

使用委托自動管理資源

透過委托模式,將 IDataReader 的使用封裝於 using 區塊,確保自動釋放:

public class DBComponent
{
    public delegate void IDataReaderHandler(IDataReader reader);

    public static void GetAuthor(string authorID, IDataReaderHandler handler)
    {
        using (SqlConnection conn = new SqlConnection("server=.;Trusted_Connection=True;DATABASE=pubs"))
        {
            SqlCommand command = new SqlCommand("select * from class where [id]=@ID", conn);
            command.Parameters.AddWithValue("@ID", authorID);
            conn.Open();
            using (SqlDataReader rdr = command.ExecuteReader(CommandBehavior.CloseConnection))
            {
                handler(rdr);
            }
        }
    }
}

頁面呼叫範例

public class WebForm1 : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.DataGrid DataGrid1;

    private void Page_Load(object sender, System.EventArgs e)
    {
        if (!IsPostBack)
            DBComponent.GetAuthor("172-32-1176", new DBComponent.IDataReaderHandler(BindGrid));
    }

    private void BindGrid(IDataReader reader)
    {
        DataGrid1.DataSource = reader;
        DataGrid1.DataBind();
    }
}

此模式確保 SqlDataReader 與 SqlConnection 於委托執行完畢後自動關閉,有效避免資源洩漏。

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