Linq-To-Sql和MARS问题 - 当前命令发生了严重错误。结果(如果有的话)应该被丢弃

时间:2013-02-19 21:43:18

标签: sql-server linq-to-sql mars kigg

我们已根据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。我尝试过这个,但它也没有解决我的问题。

不确定从哪里开始。希望有人在此之前已经看到并解决了这个问题。

3 个答案:

答案 0 :(得分:1)

我有同样的问题。一旦错误开始,我必须重新启动IIS应用程序池进行修复。

尽管尝试了许多涉及多线程的不同场景,保持连接打开等等,但我还是无法在dev中重现这个bug。

我有一个可能的领先优势,即服务器事件日志中的错误是应用程序池的OutOfMemoryException。也许这是虚假SQL Datareader错误(其他地方的内存泄漏)的根本原因。虽然我再也无法在开发中重现这一点。

显然,如果您使用的是64位操作系统,那么这可能不是您的原因。

答案 1 :(得分:1)

因此,在经过大量重构和重构之后,我们一直认为问题本身就是MARS(多个活动结果集)。不确定为什么或者究竟发生了什么,但MARS以某种方式将结果集混淆并且在重新启动Web应用程序之前不会恢复。

我们删除了MARS并且错误已停止。

如果我没记错的话,我们添加了MARS来解决使用LinqToSql已经关闭连接/命令的问题,并且我们尝试访问尚未加载的对象图。没有MARS,我们会收到错误。但是当我们添加MARS时,它似乎并不关心它。这真是一个很好的例子,我们没有真正理解我们正在做什么,我们从中学到了一些有价值的(而且代价高昂)的教训。

希望这有助于其他经历过此事的人。

感谢所有人如何贡献他们的意见和答案。

答案 2 :(得分:0)