【发布时间】:2020-01-06 06:30:17
【问题描述】:
我编写的大多数应用程序都不使用MultipleActiveResultSets=True,但我已经看到在其中几个和一些教程中启用了该选项。
这个SO question 处理相同的主题,但它已经很老了,我相信同时情况发生了很大变化。
OP 争论在执行ExecuteReader 时执行一些非查询。在这种情况下,我认为这是一个糟糕的设计,因为它可能会被一些批处理式操作所取代,也许是一个存储过程,以最大限度地减少往返次数。
当将 Entity Framework 与 ASP.NET Core 一起使用并接收到与数据上下文相关的异常时,我将其视为错误,而不是考虑启用 MARS。
阅读此MS Docs article我看到应该注意各个方面,例如选项(ANSI_NULLS,DATE_FORMAT,LANGUAGE,TEXTSIZE),安全上下文,当前数据库,状态变量(@987654329 @、@@ROWCOUNT、@@FETCH_STATUS、@@IDENTITY) 启用 MARS 时。
此外,10 年以上意味着功能更强大的服务器能够在确实需要时保持更多连接(缓存应该有助于减少这种需求)。
所以我想知道在使用现代 ASP.NET Core 应用程序 (3.0+) 时是否必须考虑启用 MARS。
问题:在使用 ASP.NET Core 3.0 和 SQL Server 2019+ 时,我应该何时使用 MultipleActiveResultSets=True?
编辑以解决反馈
我对详尽的分析不感兴趣,但需要几个适当的上下文来证明是否使用 MARS。
ASP.NET Core 应用程序中的一个典型示例是将数据库上下文设置为范围(每个请求从连接池获取数据库连接,进行更改,通常每个请求/范围一个事务)。到目前为止,为了避免 MARS,我将与每个连接的多个查询相关的错误视为我自己的错误,但我这样做并没有真正理解原因。
【问题讨论】:
-
如果您执行需要 MARS 的操作,则应启用 MARS,否则将失败。您或其他人是否应该编写使用此类操作的代码是主观的。 SQL Server 开发人员看到了现有应用程序的需求并满足了它,尽管所有使用 MARS 的代码也可以编写为不使用它。甚至在 MARS 推出时也是如此,今天仍然如此。
-
@JeroenMostert - 通过“应该”我会理解“这是一个最佳实践”。我知道十年前使用 MARS 是有原因的,但考虑到当前的框架、软件架构和计算能力,考虑使用它是否有意义?或者很快,现在使用它是一个好习惯吗?
-
“良好做法”是“给我你(最好是受过教育的)意见”的另一种说法。我敢于提出一个客观的框架来评估 MARS 的使用与不使用,我怀疑这样的事情是否适合对 SO 的单一答案——它显然不够好或不够坏为了那个原因。当然,虽然我不介意被证明是错误的。
标签: sql-server asp.net-core entity-framework-core sql-server-mars