2013-01-15 47 views
3

当我遇到发生在下面的代码坏内存泄漏内存泄漏发生异常。蚂蚁报告这是因为IDataReader指向的行没有被GC收集。但是,当我注释掉下面的行时,没有泄漏,这是我将问题隔离到这个代码的问题。执行SqlBulkCopy的

bulkCopy.WriteToServer(reader); 

有没有人有关如何防止内存泄漏的建议?

预先感谢您。

长途区号:

var reader = datatable.CreateDataReader(); 
BulkInsert(tablename, reader, connectionString); 
reader.Dispose(); 
datatable.Dispose(); 
+4

调用此代码的代码是否处置了'IDataReader'? – cjk

+0

可能是后期绑定的问题 - 这就是为什么评论该行仍然有效 - 好思维!我会仔细检查读者是否正确处理。 – Totero

+0

你传递了​​什么样的数据传递者?从理论上讲,数据读取器一次只能保存一行(直到你调用MoveNext),并且SqlBulkCopy当然应该正确处理它们。 – Andomar

回答

3

我绝对讨厌回答我的问题,但我终于找到了解决办法,虽然我觉得哑作出这样的错误,但我只是想将它张贴在万一别人的回答过这个问题,所以没人来否则会浪费宝贵的时间。

内存泄漏是不是与提供的代码段在所有 - 事实上,这不是一个泄漏在所有...

纵观性能分析我发现speedwise的BulkCopy电话是瓶颈我整个计划。我有一个生产者 - 消费者模式为其提供DataTables供其插入。

我以为Memory Profiler向我展示了当我运行代码时没有被处置的DataTable对象。这些是等待插入的事实上排队的表,但是因为我正在重新使用测试数据,所以排队的表已经在DB中(并且因此似乎已经被插入)。

通过评论BulkCopy行我实际上已经消除了瓶颈,DataTable被快速处置,因此Memory Profiler上没有显示任何问题。这使得它看起来像是批量拷贝线出错。

当我以1秒的延迟替换BulkCopy代码时,这并不足以构成瓶颈。只有当我以5秒的延迟取代BulkCopy时,我注意到我的消费者生产者队列大小失控了......因此,我为什么会快速耗尽内存。

感谢所有在这个问题上花时间的人。对不起,它没有一个更有趣的答案。

2

您可能需要为了处理读者的GC收集它。在您的finally块尝试调用Dispose。

finally 
{ 
    //reader.Close(); 
    reader.Dispose(); 
} 
+0

阅读器作为参数传递,它必须由调用者处理,除了用例外,当通过显式设置参数(例如'bool disposeReader')打开方法内的* optional *处理时。而且,调用'Close'然后'Dispose'是没有用的。调用Dispose就足够了。 – Dennis

+0

我插入了这段代码,不幸的是它对应用程序的内存配置文件没有任何影响。我仍然有泄漏。我欣赏这个建议,但是, – Totero

+1

只是一个愚蠢的想法,但你有没有试图在处理读者之前处理数据表... –