【问题标题】:Does a long lived Linq2Sql DataContext ever remove references to tracked objects?长期存在的 Linq2Sql DataContext 是否曾经删除对跟踪对象的引用?
【发布时间】:2013-01-09 10:02:53
【问题描述】:

我们继承了一些使用 Linq2Sql 的代码,并且我们刚刚发现数据上下文的一个实例存储在一个定义为私有的类成员中。由于一旦创建了该类,就会在 Web 应用程序中使用此类,因此将创建数据上下文的实例并将其分配给静态成员 - 从而生成数据上下文的实例,该实例现在将由该类的所有实例使用(所以对于所有用户来说,这本身就是一个潜在的问题)而且数据上下文的实例现在将在 Web 应用程序的持续时间内存在(因为它保存在静态类成员中)。

忽略最初做出的错误设计决策,我的问题是读入数据上下文的数据会发生什么?我知道 NHibernate 中的会话保留对它读取/创建的任何对象的引用,以便它可以跟踪更改等,并且会话可以缓慢增长和增长并且永远不会清除,除非你隐含地告诉它。 Linq2Sql 是否做类似的事情,所以如果 Web 应用程序永远存在(没有回收),这个 linq2Sql 上下文会慢慢增长,直到机器内存不足,或者它可能通过满足传入请求读取整个数据库?据我了解,上下文通常不像缓存,它会删除自身“过期”的项目,或者当达到内存限制时,开始删除最少使用的项目。由于它的作用,我认为数据上下文永远无法做到这一点?有没有人有过这方面的经验,或者确认我的理解,或者提供一个参考来说明长期存在的数据上下文可以做些什么来阻止这种情况的发生。

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    是的,如果ObjectTrackingEnabled 属性设置为trueDataContext 将跟踪它已读取的对象。默认情况下启用。如果DataContext 已经处于跟踪状态,则不能将ObjectTrackingEnabled 的值更改为false。

    当我们只是进行读取而不打算进行任何更改时,我们将 ObjectTrackingEnabled 设置为 false。当 ObjectTrackingEnabled 设置为 false 时,您无法调用 SubmitChanges

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      是的,DataContext 将保留对所有与之关联的对象的引用。 可能已删除的对象将从缓存中被驱逐,否则它会保留它们,无论它会花费多少内存。

      根据架构和数据集的大小,工作进程有时会耗尽内存并崩溃。唯一的补救措施是禁用对象跟踪(通过ObjectTrackingEnabled)或重构代码,以便每个请求使用单个DataContext,或者(不推荐)定期回收应用程序范围内的DataContext .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        相关资源
        最近更新 更多