一个无法捕获ADO.NET Dataset的内存错误

2009-05-12 22:42:50来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

Dataset是ADO.NET在内存保存数据所用的新结构。在某些方面上,Dataset和ADO的Recordset对象相似;不过,Dataset可以把整个schema(包括table、关系、关键字连同真实数据)保存在内存中,在这一点上,Dataset比Recordset功能更强。因此,你可以查询和修改Dataset而不必担心影响到正在使用它的数据库。

当考虑到Dataset把它的全部数据放在内存中,有些人会担心如果内存耗尽了会出现什么问题。做一个合理的猜测很容易,但是实际情况可能要比你猜测的要复杂一些。为了演示一下.NET在这种情况下会有什么动作,我先说说如何建立一个不停向一个Dataset中载入数据直到内存耗尽的项目。注意我们并不推荐这个过程,只是向你证明耗尽内存是多么容易的一件事。

建立TooMuchData项目

建立一个不停地向一个Dataset载入数据的项目很容易。打开Visual Studio .NET并创建一个新的VB.NET窗口应用程序。向视窗(form)中添加一个按钮控件并双击它,这样就开打了它的代码窗口。在代码窗口中填写下列代码:

Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.ClickDim sConnString As String = "Server=localhost;Database=pubs;uid=sa;pwd=;"Dim sSQL As String = "SELECT * FROM authors"Dim daProduct As SqlDataAdapter = New SqlDataAdapter(sSQL, sConnString)Dim myDS As New DataSet()Do While TruedaProduct.Fill(myDS, "authors")If myDS.Tables("authors").Rows.Count Mod 100 = 0 ThenDebug.WriteLine(myDS.Tables("authors").Rows.Count.ToString())End IfLoopEnd Sub


代码的第三行建立字符串到变量sConnString的联接。如果你想重新建立这个项目,你或许需要修改这一行的代码,除非你在服务器上运行它并有一个"sa/no password"用户ID和相应的口令。

代码的第四行建立一个简单的SQL查询。一般不推荐Select *这样的用法,但是这里没有什么问题,因为我们的目标就是抓到尽可能多的记录。选择的表格(table)的首要(primary)关键字域也不是问题,因为我们创建的Dataset是weakly type而且用来载入数据的DataTable的首要关键字域也没有设置。

下两行代码创建DataAdapter和Dataset对象。然后进入一个死循环,在死循环中调用DataAdapter的Fill方法并把记录加入称之为“authors”的DataTable中。循环包括一个If语句用来显示行数的当前值是否可以被100整除。这不是不必可少的,但是它可以有两个方面的作用:首先,你可以知道程序依然在运行;其次,你可以知道大概有多少个记录加到Dataset中去了。

运行本程序
当你建立本程序后,你可能希望在运行它之前作些修改。当Dataset越来越大时,它将消耗越来越多的内存。一旦它耗尽所有可用内存,Windows就开始把内存交换到内存交换文件中。在许多机器上,交换文件是相当大的,所以本程序可能要运行好几个小时。例如,我在测试本程序时,用的是600-MHz PIII CPU和512-MB RAM的笔记本电脑。页交换文件设置为最小值以缩短程序运行时间——这是尽快完成测试的诀窍。即使这样,本程序在塞满所有的可用内存之前还是运行了几十分钟或者若干小时。

现在你可以运行本程序并点击按钮控件来开始处理过程。它建立了一个到服务器的联接,从表格中读取数据并传到Dataset中的DataTable对象。同样的记录也保存到该Dataset直到内存最终耗尽。你可以通过任务管理器来观察内存的使用情况,你甚至可以看到可用内存的随着内存和磁盘的数据交换而增减的情况。在我的机器中,Dataset在机器耗尽内存前已经长到1400000条记录的规模。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ASP.NET 2.0中控件的简单异步回调

下一篇:深入解读ADO.NET2.0的十大最新特性