我们根据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,我也应该使用Asncrous Processing=True。我试过了,但也没有解决我的问题。
不太确定从这里去哪里。希望这里有人以前看到并解决过这个问题。
我也有同样的问题。一旦错误开始,我必须重新启动IIS应用程序池来修复。
尽管我尝试了许多不同的场景,包括多线程、保持连接打开等,但我还是无法在开发中重现错误。
我有一个可能的线索是,在服务器事件日志中的错误中,有一个应用程序池的OutOfMemoryException。也许这是虚假SQL数据读取器错误(其他地方的内存泄漏)的根本原因。尽管我还没能在开发者中重现这一点
显然,如果你使用的是64位操作系统,那么这可能不是你的原因。
因此,经过多次重构和重新架构,我们发现问题一直是MARS(多个活动结果集)本身。不确定为什么或到底发生了什么,但MARS不知何故混淆了结果集,直到重新启动web应用程序才恢复。
我们删除了MARS并停止了错误
如果我没记错的话,我们添加了MARS来解决连接/命令已经使用LinqToSql关闭的问题,并且我们试图访问尚未加载的对象图。如果没有MARS,我们就会出错。但当我们添加MARS时,它似乎并不关心它。这真的是一个很好的例子,说明我们没有真正了解自己在做什么,我们从中吸取了一些宝贵的(也是昂贵的)教训。
希望这能帮助其他经历过这种情况的人。
感谢所有贡献意见和答案的人。
我知道你找到了解决方案。。
以下不是问题的直接解决方案;但对其他人来说,看看是件好事
-
什么是";当前命令出现严重错误。如果有结果,则应丢弃"SQL Azure错误意味着什么?
-
http://social.msdn.microsoft.com/Forums/en-US/bbe589f8-e0eb-402e-b374-dbc74a089afc/severe-error-in-current-command-during-datareaderread