c# – 如何正确管理DataContext的处理?
我有一个非常重的数据库访问的Web服务.它在测试中运行良好,但是一旦我将其投入生产并加速加载,它就会开始产生在DataContext中调用某个方法时引发的错误.错误通常是以下之一:
但不总是. 任何单个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中的一个项目,我得到…
…每当我的datacontext被多次使用时.这是因为我的use(…){}代码在首次使用后处理我的datacontext. 所以,我的问题是……在我浏览整个数据访问层并删除大量使用之前,这样做的正确方法是什么?我不想通过取出使用来导致内存泄漏,但同时我想在不同的数据访问对象之间共享我的datacontext. 我应该只是删除使用,并在我从Web服务请求返回之前手动调用dispose方法吗?如果是这样,我怎么去确保我捕捉到所有的东西,记住我有几个可能变得凌乱的try-catch块. 还有另一种更好的方法吗?我应该忘记处理并希望一切都被隐瞒了吗? UPDATE 问题似乎不是性能问题……请求处理非常快,不超过200毫秒.事实上,我已经通过生成大量虚假请求进行负载测试而没有任何问题. 据我所知,它与负载有关的原因有两个: >大量请求会导致并发请求相互影响 当问题确实发生时,应用程序池将进入错误状态,并需要循环才能使其再次运行. 解决方法
虽然我更喜欢使用工作单元的方法,但有时它并不总是适合您的设计.理想情况下,您需要确保在完成SqlConnection时释放它,以便其他请求有可能从池中获取该连接.如果这是不可能的,那么您需要的是确保在每个请求之后处理上下文.这可以通过以下两种方式完成:
>如果您正在使用WebForms,则可以在页面生命周期结束时处理DataContext.检查HttpContext.Items集合以确定最后一页是否有数据上下文,如果有,则将其丢弃. 上述两种解决方案的问题在于,如果您负载过重,您会发现很多请求都在等待连接可用,这可能会超时.你必须权衡风险. 总而言之,工作单元方法仍然受到青睐,因为您在不再需要时立即释放资源. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |