DataSet和DataReader问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataSet和DataReader问题相关的知识,希望对你有一定的参考价值。
我要做一个网站,读取数据是选用DataSet还是用DataReader?哪个好, 因为我实体类有表类型,如果用DataSet的话不能对应它们的关系, 如: private int iD; private UserInfo userID; 这里面的UserInfo是一个实体类类型, 对应的就是一个数据表, 如查用DataReader的话,返回的是一个List集合, 想请问一下大家该怎么选择?请详细回答一下, 还有就是一个项目读取数据是用DataSet和DataReader中的一种,还是两个都要用到?
参考技术A 如果一次性读取的数据量较大建议使用DataSet,DataSet读取之后占的是内存空间,但是现在一般的电脑都有1G以上的内存,所以这点内存算不了什么。完全可以忽略。如果使用DataReader可能会导致网站读取数据的时候出现假死现象。(千条以上)
如果是少量数据
建议使用DataReader,读取速度较快。让用户体验的舒服些。
由于...,DataSet 是不是比 DataReader 慢?
【中文标题】由于...,DataSet 是不是比 DataReader 慢?【英文标题】:Is DataSet slower than DataReader due to...?由于...,DataSet 是否比 DataReader 慢? 【发布时间】:2010-11-12 00:16:07 【问题描述】:DataSets
在从数据库中检索数据时可能比DataReader
慢 10 倍以上。我认为这是由于DataSets
必须处理关系等的开销。但是DataSets
和DataReader
之间的速度差异是由于DataSets
必须从DB,还是由于应用程序必须进行更多处理,或两者兼而有之?
我假设 DataAdapter
在后台使用 DataReader
,因此应用程序需要执行的命令数才能检索 100 行 DataAdapter
等于或大于应用程序需要执行的命令数,如果这些100 行由DataReader
直接检索。 DataReader
是一次检索一行还是一次检索一个字段(特定行的)?
【问题讨论】:
你怎么知道 DataSets 比 DataReaders 慢 10 倍?即使接近这个数字,我也没有测量出任何差异,更像是 +/- 5% 的差异。 你有那个“10x”的参考或证据吗? 不管细节如何,一般来说,DataReader 通常会快很多(根据我的经验,如果您的查询实际上返回许多行,几乎总是超过 5% - 否则没关系无论如何)。我不确定为什么 DataSet 慢得多,我想这是一个合理的问题。 我已在以下链接阅读:devx.com/vb2themax/Article/19887/1954?pf=true 【参考方案1】:在 DataReader 上使用 DataSet 时可能会出现一些不同类型的开销:
DatSet 包含包含数据的 DataTable 对象,其中包含 DataRow 对象。创建所有对象的开销很小。每个 DataRow 都将其所有值视为对象,因此任何值类型都被装箱,这为每个字段增加了一些开销。
当您使用 DataAdapter 填充 DataSet 时,很容易获得大量您不会使用的数据。如果您不指定所需的字段,即使您不会全部使用它们,您也会获得所有字段。如果您不过滤查询,则会从表中获取所有行。即使您稍后使用 DataTable 上的 DataView 过滤它们,您仍然可以从数据库中获取它们。使用 DataReader,您更接近于获取数据的查询,因此与您在结果中获得的内容之间的联系更加明显。
如果您将数据提取到 DataSet 中的多个 DataTable 对象中,并使用关系让 DataSet 组合数据,那么您可以让 DataSet 完成您本可以让数据库完成的工作,这对其进行了更优化。
如果你很好地使用了 DataSet,开销也不会那么糟糕,而是 30% 而不是 1000%。
假设 DataAdapter 使用 DataReader 是正确的。如果你小心使用 DataAdapter,那么数据库操作本身就和你自己使用 DataReader 一样。
DataReader 将一次从底层数据库驱动程序获取一条记录,而该驱动程序又将一次从数据库中获取一个充满记录的缓冲区。如果记录非常大,一次可能只有一条记录可以放入缓冲区,但缓冲区中通常有数十条记录,如果它们真的很小,甚至有数百条记录。
【讨论】:
【参考方案2】:MSDN上的几点建议:
Benchmarks DataSet vs. DataReader Working with DataReaders, DataSets, DataAdapters, and DataViews【讨论】:
【参考方案3】:DataReader
类似于旧的 ADO 概念,即只进记录集。只进记录集不需要维护任何类型的指针信息,因此总是比传统的DataSet
实例快。因此,DataReader
不会缓存任何数据,需要打开与数据库的连接才能获取底层数据。
这解释了为什么您需要为DataReader
编写以下代码:
DataReader reader = GetANewDataReaderInstance();
while (reader.Read())
...
现在与DataSet
相比,情况发生了很大变化。本质上,您可以将数据库模式的子集拉入DataSet
,例如表关系、删除和更新规则,当然,当您将数据提交到数据存储时,自动重新填充数据集中的行。 DataSets
也可以进行“断连”操作,即可以获取所需数据并关闭数据库连接。
总结
然而,所有这些功能都是有代价的:如果您希望尽快填充自定义业务对象,请使用DataReader
s,否则请使用DataSet
s。
【讨论】:
【参考方案4】:对您在 Internet 搜索中找到的内容要非常小心。您发布的文章说
使用 .NET 的候选版本之一
编写的 VB.NET 应用程序
那是大约七年前的事了!
请务必查看更新的内容:
New DataSet Features in ADO.NET 2.0 Asynchronous Command Execution in ADO.NET 2.0【讨论】:
【参考方案5】:阅读 Scott Mitchell 的 Why I Don't Use DataSets in My ASP.NET Applications。我认为它涵盖了您感兴趣的重点。
【讨论】:
那篇文章展示了一个令人难以置信的图表,该图表展示了随着结果数量从 100 增加到 1000 的数据集从 1 秒攀升到 10 秒。坦率地说,这不太可能。【参考方案6】:我更喜欢使用 DataReader 来填充列表。
您可以通过一些好的 cmets/answers 查看我最近提出的问题:
Datasets
【讨论】:
以上是关于DataSet和DataReader问题的主要内容,如果未能解决你的问题,请参考以下文章