0

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

不太确定从这里去哪里。希望这里有人已经看到并解决了这个问题。

4

3 回答 3

1

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

尽管尝试了许多涉及多线程、保持连接打开等不同的场景,但我仍然无法在 dev 中重现该错误。

我确实有一个可能的线索是,服务器事件日志中的错误是应用程序池的 OutOfMemoryException。也许这是虚假 SQL Datareader 错误(其他地方的内存泄漏)的根本原因。尽管我再次无法在 dev.xml 中重现这一点。

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

于 2013-05-20T03:37:41.467 回答
1

因此,经过多次重构和重新架构,我们发现问题一直是 MARS(多活动结果集)本身。不知道为什么或究竟发生了什么,但 MARS 以某种方式将结果集弄混了,并且在重新启动 Web 应用程序之前无法恢复。

我们删除了 MARS,错误停止了。

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

希望这对经历过这种情况的其他人有所帮助。

感谢所有如何贡献他们的评论和答案。

于 2013-05-25T21:09:21.643 回答
0

我知道你想出了解决方案..

以下不是问题的直接解决方案;不过给别人看看就好了

  1. 什么是“当前命令发生严重错误。结果(如果有)应丢弃。” SQL Azure 错误是什么意思?

  2. http://social.msdn.microsoft.com/Forums/en-US/bbe589f8-e0eb-402e-b374-dbc74a089afc/severe-error-in-current-command-during-datareaderread

于 2013-12-10T16:05:15.867 回答