VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • C# IDataReader 造成的资源泄漏

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  在ADO(+)数据访问的时候,MS曾经在其出版的书籍中强调过(有可靠证据),尽量不要使用使用DataSet访问对象,而是使用IDataReader这个只读的向前的记录集访问,的确,这是有一定的道理的,DataSet是把数据集先置于内存中,然后告诉缓存起来,断开连接,IDataReader是直接读取的.

  在数据量较少的情况下,DataSet和IDataReader的优劣并没有非常明显的优劣,然而,当数据流量达到一定量(200条左右),这和您的计算机的硬件配置有关,IDataReader的优势就很明朗了.

  在访问数据量较多的时候,如果您热衷于使用IDataReader读取数据库,那么,以下的一个问题是很明显的,如果线路阻塞,记录异常关闭,线路突然中止,这时候就数据库服务器中闲置了一条任何程序都无法再利于的线程-资源泄漏了.曾经,可以时候Close关闭链接池的,但,难道要每次DataBind完毕了操作这个么?如果DataBind失败,而您又使用了Catch语句,那这个线路又闲置了.根据本人的经验,在WinApp的开发中,.Net所限制的线路最大的pool是21,在Web开发中,更少,4条抑或更少.

  这里介绍一种方法,使用Delegates关闭,使用委托的优势就是自动关闭,每次完毕,自动激发这个委托.

  

publicclassDBComponent{
  publicdelegatevoidIDataReaderHandler(IDataReaderreader);
  publicstaticvoidGetAuthor(stringauthorID,IDataReaderHandlerhandler){
  using(SqlConnectionconn=newSqlConnection("server=.;Trusted_Connection=True;DATABASE=pubs")){
   SqlCommandcommand=newSqlCommand("select*fromclasswhere[id]=@ID",conn);
   command.Parameters.AddWithValue("@ID",authorID);
   conn.Open();
   using(SqlDataReaderrdr=command.ExecuteReader(CommandBehavior.CloseConnection)){
    handler(rdr);
   }
  }
  }
}

  注意到handler(rdr);这是引发委托的语句.

  页面使用的时候:

publicclassWebForm1:System.Web.UI.Page
{
protectedSystem.Web.UI.WebControls.DataGridDataGrid1;
privatevoidPage_Load(objectsender,System.EventArgse){
 if(!IsPostBack)
 DataComponent.GetAuthor("172-32-1176",newDataComponent.IDataReaderHandler(BindGrid));
}
privatevoidBindGrid(IDataReaderreader)
{
 DataGrid1.DataSource=reader;
 DataGrid1.DataBind();
}
}



相关教程