我们根据 CodePlex 上 Kigg 项目的设计搭建了一个网站:
http://kigg.codeplex.com/releases/view/28200
基本上,代码使用存储库模式,以及基于 Linq-To-Sql 的存储库实现。完整的源代码可以在上面的链接中找到。
该网站已经运行了一段时间,大约一年前,我们开始收到如下错误:
- 已经有一个与此命令关联的打开的 DataReader,必须先关闭它。
- ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭。
这些是我根据记忆找到的最接近的错误示例。当网站流量开始增加时,这些错误开始发生。把头撞在墙上后,我想通了假设问题出在 Linq-To-Sql 内部,以及我们如何使用同一连接在单个 Web 请求中调用多个命令。
最终,我发现了 MARS(多个活动结果集)并将其添加到数据上下文的连接字符串中,就像魔术一样,我所有的错误都消失了。
现在,快进大约 1 年,网站流量大幅增加。每周左右,我都会在 SQL Server 中收到一条错误消息,内容为:
当前命令发生严重错误。结果,如果有的话,应该被丢弃
在此错误之后,我立即在错误日志中收到数百到数千个 InvalidCastException 错误。基本上,每次调用 Linq-To-Sql 数据上下文时都会出现此错误。只有在我重新启动 Web 服务器后,这些错误才会清除。
我在 Micosoft 支持网站上阅读了一篇文章,描述了我的问题(减去 InvalidCastException 错误),并指出解决方案是,如果我要使用 MARS,我也应该使用 Asncronous Processing=True。我试过这个,但它也没有解决我的问题。
不太确定从这里去哪里。希望这里有人已经看到并解决了这个问题。