c# – 如何正确管理DataContext的处理?

我有一个非常重的数据库访问的Web服务.它在测试中运行良好,但是一旦我将其投入生产并加速加载,它就会开始产生在DataContext中调用某个方法时引发的错误.错误通常是以下之一:

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毫秒.事实上,我已经通过生成大量虚假请求进行负载测试而没有任何问题.

据我所知,它与负载有关的原因有两个:

>大量请求会导致并发请求相互影响
>问题更频繁地发生,因为有很多请求.

当问题确实发生时,应用程序池将进入错误状态,并需要循环才能使其再次运行.

解决方法

虽然我更喜欢使用工作单元的方法,但有时它并不总是适合您的设计.理想情况下,您需要确保在完成sqlConnection时释放它,以便其他请求有可能从池中获取该连接.如果这是不可能的,那么您需要的是确保在每个请求之后处理上下文.这可以通过以下两种方式完成:

>如果您正在使用WebForms,则可以在页面生命周期结束时处理DataContext.检查HttpContext.Items集合以确定最后一页是否有数据上下文,如果有,则将其丢弃.
>创建一个专用的IHttpModule,它将事件附加到请求的末尾,您可以像上面那样执行操作.

上述两种解决方案的问题在于,如果您负载过重,您会发现很多请求都在等待连接可用,这可能会超时.你必须权衡风险.

总而言之,工作单元方法仍然受到青睐,因为您在不再需要时立即释放资源.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...