Object reference not set to an instance of an object
Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.
但并不总是如此。
任何单个Web服务请求都可能导致多达10或15个数据库查询和1或2个更新。
我设计了一个数据访问层,其中包含代表数据库表并保存所有业务逻辑的一堆对象。这是一个与Web GUI共享的单独项目,不同于我的Web服务。
数据访问对象派生自一个基类,该基类具有GetDataContext()方法,以便在需要时启动数据上下文的实例。
在我的所有数据访问对象中,我都写了这个:
using (db = GetDataContext())
{
// do some stuff
}
我很高兴地为每个数据库交互创建/使用/处理我的DataContext(由sqlmetal.exe创建)对象。
经过多小时的头痛,我认为错误的原因是在负载下,datacontext对象被创建和处理得太多了,我需要改变事物,使同一个数据请求共享相同的datacontext。
我在互联网上找到了这篇文章,其中有一个DataContextFactory,似乎正是我所需要的。
然而,现在我已经实现了这一点,并将DataContext保存为HttpContext中的一个项目,当我的datacontext被多次使用时,我会得到以下错误信息:
Cannot access a disposed object.
Object name: 'DataContext accessed after Dispose.'
这是因为我的using (...) {}
代码在第一次使用后就处理了我的datacontext。
所以,我的问题是... 在我遍历整个数据访问层并删除大量usings
之前,什么是正确的方法?我不想通过去除usings
来引起内存泄漏,但同时我希望在不同的数据访问对象之间共享我的datacontext。
我应该只删除usings
,并在从Web服务请求返回之前手动调用dispose方法吗?如果是这样,那么我该如何确保捕获所有内容,考虑到我有几个try-catch
块,可能会变得混乱。
是否有更好的方法来做到这一点?我应该忘记处理并希望所有东西都被隐式清除吗?
更新
问题似乎不是性能问题...请求处理非常快,不超过200毫秒。实际上,我通过生成大量的虚假请求进行了负载测试,没有任何问题。
据我所见,它与负载有关,原因有以下两种:
- 高数量的请求会导致并发请求相互影响
- 问题更频繁地发生只是因为有很多请求。
当问题发生时,应用程序池进入错误状态,并需要重新启动才能使其正常工作。
DataContext
实例对我来说似乎不算太多。创建一个DataContext
非常轻量级。它可能会提高一些性能,因为它缓存了实体,但仅此而已。您是否分析过发送到数据库的查询?在一个请求期间有多少查询被触发? - Steven