1

我们有时会在 ASP.NET MVC 4 应用程序中收到来自 PetaPoco 的以下数据库连接错误:

There is already an open DataReader associated with this Command which must be closed first.;
System.Data;    at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)...    

当我们对系统施加更多负载时,似乎会发生这种情况。

我们在研究中发现的一些建议是:

  • 执行 PetaPoco Fetch 而不是 Query
  • 将 MultipleActiveResultSets=True 添加到我们的连接字符串

有 PetaPoco 经验的人能否验证这些建议是否有帮助?任何其他避免异常的建议将不胜感激。

2013 年 6 月10 日更新我们将 Query 更改为 Fetch,我们看到了一些改进,但有时我们仍然会看到错误。

有谁知道将连接字符串更改为MultipleActiveResultSets=True可能有什么缺点?

4

1 回答 1

2

确保您正在为每个请求创建 PetaPoco DB(不是静态的)。

请参阅:如何使用 petapoco 创建 DAL

2013 年 6 月10 日更新所有Fetch方法都调用该Query方法(参见源代码)

在此处输入图像描述

因此,将一个更改为另一个对错误没有影响

MSDN上列出了这些缺点,其中包括以下警告:

  • 语句交错
  • 会话缓存
  • 线程安全
  • 连接池
  • 并行执行

我亲自尝试过,没有任何缺点(取决于您的应用程序),但也没有摆脱错误。

唯一可以消除错误的方法是,按照您的请求代码查找语句在代码中被调用两次的位置,然后在该函数中使用其他数据库连接。

此外,您可以捕获错误,然后创建一个新的数据库连接并尝试使用该新连接。

抱歉,这里不是灵丹妙药。

于 2013-04-26T19:56:06.423 回答