程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#的IDataReader造成的資源洩漏

C#的IDataReader造成的資源洩漏

編輯:關於C語言

ADO(+)數據訪問的時候,MS曾經在其出版的書籍中強調過(有可靠證據),盡量不要使用使用DataSet訪問對象,而是使用IDataReader這個只讀的向前的記錄集訪問,的確,這是有一定的道理的,DataSet是把數據集先置於內存中,然後告訴緩存起來,斷開連接,IDataReader是直接讀取的.

在數據量較少的情況下,DataSet和IDataReader的優劣並沒有非常明顯的優劣,然而,當數據流量達到一定量(200條左右),這和您的計算機的硬件配置有關,IDataReader的優勢就很明朗了.

在訪問數據量較多的時候,如果您熱衷於使用IDataReader讀取數據庫,那麼,以下的一個問題是很明顯的,如果線路阻塞,記錄異常關閉,線路突然中止,這時候就數據庫服務器中閒置了一條任何程序都無法再利於的線程-資源洩漏了.曾經,可以時候Close關閉鏈接池的,但,難道要每次DataBind完畢了操作這個麼?如果DataBind失敗,而您又使用了Catch語句,那這個線路又閒置了.根據本人的經驗,在WinApp的開發中,.Net所限制的線路最大的pool是21,在web開發中,更少,4條抑或更少.

這裡介紹一種方法,使用Delegates關閉,使用委托的優勢就是自動關閉,每次完畢,自動激發這個委托.

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);
}
}
}
}

注意到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)
DataComponent.GetAuthor("172-32-1176",new DataComponent.IDataReaderHandler(BindGrid));
}
private void BindGrid(IDataReader reader)
{
DataGrid1.DataSource = reader;
DataGrid1.DataBind();
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved