DataReader还是DataSet,这是个问题

来源:互联网 发布:仓库平面图 软件 编辑:程序博客网 时间:2024/05/16 06:49

今天碰到一是用DataReader还是DataSet的问题,那到底用那个好,要怎么用呢?先查看下MSDN。

一)基础分析

      在决定应用程序应使用 DataReader还是应使用 DataSet时,应考虑应用程序所需的功能类型。 使用 DataSet 可执行以下操作:

      1、在应用程序中将数据缓存在本地,以便可以对数据进行处理。 如果只需要读取查询结果,则 DataReader 是更好的选择(如需要差看某条记录的详情,或使用分页绑定GridView为IList时)。

      2、在层间或从 XML Web 服务对数据进行远程处理。

      3、与数据进行动态交互,例如绑定到 Windows 窗体控件或组合并关联来自多个源的数据。

      4、对数据执行大量的处理,而不需要与数据源保持打开的连接,从而将该连接释放给其他客户端使用。

      如果不需要 DataSet 所提供的功能,则可以通过使用 DataReader 以只进、只读方式返回数据,从而提高应用程序的性能。 虽然 DataAdapter 使用 DataReader 来填充 DataSet 的内容,但使用 DataReader 可以提升性能,因为这样可以节省 DataSet 所使用的内存,并将省去创建 DataSet 并填充其内容所需的处理。


      从中可以看到DataSet其实保持的是一个内存数据库,里面可以包含多个DataTable,并可以对其CURD操作,这些处理是缓存的、断开连接的。

      而DataReader则是一个只进的、只读方式返回数据的,因此节省了农村,提高了性能。


      由上分析可以认为:DataSet是不验证逻辑把数据缓存,故而连接时间极短,但数据冗余、占用内存大,但支持更多的数据库连接并发量。节省了数据库的链接开支,提高了数据库的使用效率。 DataReader 需要填充业务逻辑,因此数据库的链接始终占有,但数据精简、基本上只消耗基本内存,因此服务器可以实现更多的处理,提高了服务器得使用效率。但数据库连接一直维持,增加了数据库的开销,降低了数据库的并发量。因此在考虑使用哪个时,应着手分析是服务器有压力,还是数据库有压力,并执行相应的处理。但可以整理大概如下使用的场景,可以在使用的过程中做参考。

     当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。

      a)要通过应用程序执行以下操作,就要使用DataSet:
     1、 在结果的多个离散表之间进行导航。
     2、操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。
     3、在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。
     4、重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。
     5、每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。
     6、使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。

      b)对于下列情况,要在应用程序中使用DataReader:
    1、不需要缓存数据。
    2、要处理的结果集太大,内存中放不下。
    3、一旦需要以仅向前、只读方式快速访问数据。

备注:
   填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。

 

二)场景分析
   下面就是运用DataReader类的理想条件:
   1、你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个DataReader类不会消耗很多内存,不过随着负荷的增加,DataSet上的性能也会很快地提高。
你对每行数据的需求很简单。该情况的最好的例子就是简单地将DataReader绑定到一个Web控件,如DataGrid或DropDownList。
   2、你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取XML数据。在这种情况下,你可以用SQLCommand对象的ExcecuteXmlReader()方法来得到一个 XmlReader类(相当于XML版的DataReader)。这就需要一个运用FOR XML子句的SQL Server查询,或者一个包含有效XML的ntext字段。
   3、你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。的确,


   使DataSet类更强大的许多功能只适用于基于客户端的Windows Form应用程序,比如在多个表之间建立关系的功能。在很多情况下,DataSet类都比DataReader类更有优势,而且在有些情况下,你根本就不能用DataReader类。
  
在下面的情况,你应该考虑运用DataSet类:
   1、你构建了一个Web service,它运用的数据是你作为返回值读取的数据。因为DataReader类必须保持到数据库的连接,所以它们不能被序列化到XML中,也不能被发送给一个Web service的调用者。
   2、你需要排序或筛选数据。在运用一个DataView对象(呈现为DataTable类的DefaultView属性,它包含一个DataSet类)来排序或筛选数据前,我们先试着用SQL查询(如WHERE和ORDER BY语句)来实现这些功能,并运用更轻量级、更快的DataReader类。然而,有时侯用这种方法是不行的,或者当你需要多次地对数据进行排序或筛选时就不能用DataReader。针对同一请求,你需要多次遍历数据。你只能在DataReader中循环一次。如果你想将多个ServerControl类绑定到同一个数据集,那么选择 DataSet就更好。DataReader类不能被绑定到多个ServerControl类,因为它是只向前读取的。在这种情况下,如果要使用 DataReader,必须从数据库读取两次数据。
   3、你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求它的专门的人使用,你可以将DataSet类保存在一个Session变量中。如果数据可以被任何人访问,那么你可以将它保存在一个Application变量中,或保存在Cache中(我建议使用后一种方法,因为它支持时间期限和回调(callback))。因为DataReader类必须一直打开对数据库的连接,而且它一次只能保存一行数据,所以它们不能在跨页面请求中被保存。
   4、你需要对一个结果集的每个元素实现特殊的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个Web service来得到每个地区的详细的天气状况信息,那么选择DataSet就会更好。这是因为,当你在用DataReader类时,在关闭 DataReader类前,与数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个很小的延时都会造成Web应用程序的很高的访问量,从而就会消耗完可用的连接。相反,DataSet可以在前端读取所有的数据,并可以马上关闭与数据库的连接,将它返回到连接池,因此其它的页面请求就可以用这个连接了。
   5、你需要在一个两维范例中加载并处理XML数据。DataSet类对于XML很有用,因为你可以将DataView用于XML,对根本的数据进行排序和筛选,就同处理一个数据库结果集一样。然而,需要注意的是在System.Xml名字空间中有很多类,你可以将它们用于更复杂的XML操作。
你的数据源不是一个数据库。虽然OleDbDataReader可以用于任何OLEDB数据提供者(可能指向一个数据库,也可能不指向一个数据库),但 DataSet对象可以从一个XML文件直接加载数据,并动态地解释它的schema。DataSet类也可以将XML数据写回一个数据流或一个文件。

原创粉丝点击