3

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

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

4

2 回答 2

3

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

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

我希望这会有所帮助。

于 2013-01-09T15:21:54.670 回答
3

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

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

于 2013-02-01T10:19:58.430 回答