我一直在使用LINQ-To-SQL来解决内存使用问题.我在Windows服务中使用它来进行一些处理,我正在循环遍历大量数据,我正在从上下文中撤回.是的 - 我知道我可以通过存储过程来做到这一点,但有理由说这不是理想的解决方案.
无论如何,我所看到的基本上是内存即使在我打电话后也没有被释放context.SubmitChanges()
.所以我最终不得不做各种各样奇怪的事情,比如只追回100条记录,或创建几个上下文并让它们都做单独的任务.如果我保持不变DataContext
并稍后将其用于其他调用,它只会占用越来越多的内存.即使我调用查询返回给我Clear()
的" var tableRows
"数组,将其设置为null,并调用SYstem.GC.Collect()
- 它仍然不会释放内存.
现在我已经阅读了一些关于如何DataContexts
快速使用并快速处理它们的内容,但似乎它们应该是强制上下文转储所有数据(或特定表的所有跟踪数据)的方法.某一点保证内存是免费的.
有人知道哪些步骤可以保证释放内存?
DataContext跟踪它所获取的所有对象.在收集垃圾之前不会释放它.此外,在实现时IDisposable
,您必须调用Dispose
或使用该using
语句.
这是正确的方法:
using(DataContext myDC = new DataContext) { // Do stuff } //DataContext is disposed
如果不需要对象跟踪,请将DataContext.ObjectTrackingEnabled设置为false.如果确实需要它,可以使用反射来调用内部DataContext.ClearCache(),尽管你必须知道,因为它的内部,它在框架的未来版本中会消失.据我所知,框架本身并没有使用它,但它确实清除了对象缓存.
正如David指出的那样,您应该使用using块处理DataContext.
您的主要关注点似乎是创建和处理一堆DataContext对象.这就是linq2sql的设计方式.DataContext意味着具有较短的生命周期.由于您从数据库中提取了大量数据,因此有大量内存使用是有意义的.通过以块为单位处理数据,您处于正确的轨道上.
不要害怕创建大量的DataContexts.它们被设计成以这种方式使用.