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服务的一个单独项目,因为它与Web GUI共享.
数据访问对象派生自一个基类,该基类具有GetDataContext()方法,可在需要时启动数据上下文的实例.
我写的所有数据访问对象都是:
using (db = GetDataContext()) { // do some stuff }
为每个数据库交互愉快地创建/使用/处置我的DataContext(由sqlMetal.exe创建)对象.
经过几个小时的搔抓,我想我已经确定我的错误的原因是在加载时datacontext对象被创建和处理的方式太多了,我需要更改东西以共享相同的datacontext持续时间Web服务请求.
我在互联网上找到了this article,它有一个DataContextFactory,似乎完全符合我的需要.
但是,现在我已经实现了这个,并且DataContext被保存为HttpContext中的一个项目,我得到…
Cannot access a disposed object.
Object name: ‘DataContext accessed after Dispose.’
…每当我的datacontext被多次使用时.这是因为我的use(…){}代码在首次使用后处理我的datacontext.
所以,我的问题是……在我浏览整个数据访问层并删除大量使用之前,这样做的正确方法是什么?我不想通过取出使用来导致内存泄漏,但同时我想在不同的数据访问对象之间共享我的datacontext.
我应该只是删除使用,并在我从Web服务请求返回之前手动调用dispose方法吗?如果是这样,我怎么去确保我捕捉到所有的东西,记住我有几个可能变得凌乱的try-catch块.
还有另一种更好的方法吗?我应该忘记处理并希望一切都被隐瞒了吗?
UPDATE
问题似乎不是性能问题……请求处理非常快,不超过200毫秒.事实上,我已经通过生成大量虚假请求进行负载测试而没有任何问题.
据我所知,它与负载有关的原因有两个:
>大量请求会导致并发请求相互影响
>问题更频繁地发生,因为有很多请求.
当问题确实发生时,应用程序池将进入错误状态,并需要循环才能使其再次运行.
解决方法
>如果您正在使用WebForms,则可以在页面生命周期结束时处理DataContext.检查HttpContext.Items集合以确定最后一页是否有数据上下文,如果有,则将其丢弃.
>创建一个专用的IHttpModule,它将事件附加到请求的末尾,您可以像上面那样执行操作.
上述两种解决方案的问题在于,如果您负载过重,您会发现很多请求都在等待连接可用,这可能会超时.你必须权衡风险.
总而言之,工作单元方法仍然受到青睐,因为您在不再需要时立即释放资源.