【问题标题】:PetaPoco Should I use MultipleActiveResultSets=True?PetaPoco 我应该使用 MultipleActiveResultSets=True 吗?
【发布时间】:2013-04-26 19:21:39
【问题描述】:

我们有时会在 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 获取而不是查询
  • 将 MultipleActiveResultSets=True 添加到我们的连接字符串

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

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

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

【问题讨论】:

  • 你是如何解决这个问题的?这也发生在我身上。我正在使用带有 PerWebRequest 生活方式的 Castle Windsor(我认为它类似于 Structuremap HttpContextScoped)
  • 我们尝试将 Query 更改为 Fetch 并取得了一些不错的结果,但有时仍会发现问题。你呢?

标签: sql-server-2008 asp.net-mvc-4 database-connection petapoco


【解决方案1】:

确保您是按请求创建 PetaPoco DB(不是静态的)。

见:how to create a DAL using petapoco

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

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

MSDN 中列出了缺点,并包含以下警告:

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

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

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

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

对不起,这里不是灵丹妙药。

【讨论】:

  • 是的,我们正在使用 StructureMap HttpContextScoped 为每个请求创建 PetaPoco DB。这是最佳做法还是应该是暂时的? MultipleActiveResultSets=True 对我们有帮助吗?
  • 抱歉,我不知道 StructureMap。如果您收到错误,那是因为有两个或多个查询同时访问同一连接中的相同结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2011-12-26
  • 2021-12-10
相关资源
最近更新 更多