- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写的大多数应用程序不使用 MultipleActiveResultSets=True
,但我已经看到在其中几个和一些教程中启用了该选项。
这个 SO question 处理相同的主题,但它很旧,我相信在此期间情况发生了很大变化。
OP 争论执行一些非查询,同时执行 ExecuteReader
。在这种情况下,我认为这是一个糟糕的设计,因为它可能会被一些批处理样式的操作取代,也许是一个存储过程,以最大限度地减少往返次数。
当将 Entity Framework 与 ASP.NET Core 一起使用并收到与已在范围内执行某些内容的数据上下文相关的异常时,我将其视为错误而不考虑启用 MARS。
与MARS工作时读了这MS Docs article我看到一个要注意的各个方面,如选项(ANSI_NULLS
,DATE_FORMAT
,LANGUAGE
,TEXTSIZE
),安全性上下文,当前的数据库,状态变量(@@ERROR
,@@ROWCOUNT
,@@FETCH_STATUS
,@@IDENTITY
)启用。
此外,如果确实需要,10 年以上意味着功能更强大的服务器能够保持更多连接(缓存应该有助于减少这种需求)。
所以我想知道在使用现代 ASP.NET Core 应用程序 (3.0+) 时是否必须考虑启用 MARS。
问题: 使用 ASP.NET Core 3.0 和 SQL Server 2019+ 时,我什么时候应该使用 MultipleActiveResultSets=True?
编辑以解决反馈
我对详尽的分析不感兴趣,但有几个合适的上下文来证明是否使用 MARS 是合理的。
ASP.NET Core 应用程序中的一个典型示例是将数据库上下文作为范围(每个请求从连接池获取一个数据库连接,进行更改,通常每个请求/范围一个事务)。到目前为止,我已经将与每个连接的多个查询相关的错误视为我自己的错误,以避免 MARS,但我这样做了,但我没有真正理解原因。
最佳答案
是的,MARS 在现代数据访问框架中仍然占有一席之地,因为它们提供了以下两个主要一般查询问题的(高效)解决方案 - 流(即非缓冲)(1)具有急切加载相关数据集合的数据和(2)懒惰加载任何类型的相关数据。
在这两种情况下,执行查询预计会提供 IEnumerator<T>
(或其异步版本),它是数据读取器(或数据库前向只读游标)的对象等价物。因此,每个 MoveNext{Async}
都应该映射到数据读取器的 ReadNext
,并且预计会提供一个完全填充的 T
,而没有缓冲在所有其他人之前。为了实现这一点,底层数据读取器必须在枚举期间保持打开状态,并在完成或提前中止时关闭(例如, FirstOrDefault()
)——原因之一 IEnumerator<T>
是 IDisposable
。
现在想象一下如果您启用了延迟加载会发生什么。您获得一些实体并访问一些导航属性。这就触发了延迟加载操作,当然需要执行reader从数据库中获取数据。由于外部阅读器仍处于打开状态(事件),因此在没有 MARS 的情况下,此操作只会因运行时异常而失败。不好。除了提前缓冲所有内容(基本上切换到快照模式)或不使用延迟加载之外,您或框架无能为力。
假设您不使用延迟加载(无论如何都不推荐)。但是您的实体包含相关的数据集合,并且您希望预先加载它们。关系数据库 SQL 提供平面结果集,即不支持查询结果集中的“嵌套集合”。那么如何流式传输这些数据呢?
基本上有两种解决方案。
首先是基于包含所有主 + 相关表列的单个 SQL 查询,并返回某种混合记录,其中某些字段适用于特定结果而其他字段为空值。 EF6 和 EF Core 3.0+ 使用此方法。 EF Core 1.x/2.x 使用另一种方法,EF Core 5.0 允许您在两者之间进行选择。为什么?因为当您有多个子集合时,这往往会产生非常低效的查询(执行和处理结果集,因为它传输了大量不必要的数据)。
其次是使用单独的查询——一个用于主结果集,一个用于每个相关的子集合。这个想法很简单。由于通常 PK 和 FK 都被索引,因此数据库可以使用索引有效地返回按这些列排序的它们(无论如何 join
操作都需要),然后它们可以通过预读(缓冲)最多一条记录轻松地在客户端合并。
听起来不错,不是吗?有一个小而重要的警告——它需要火星!否则,它必须切换到缓冲模式。这完全违背了 IEnumerator
和异步版本的想法 - 取消概念。您可以在我对 How can I abort a running EF Core Query using GetAsyncEnumerator? 的回答中看到后者的效果,最后的建议是启用 MARS。
有关 EF Core 查询的更多信息,请参阅官方 EF Core 文档的 Split queries 和 How Queries Work(以及基本上整个 Query data )部分。
旁注 单独的连接并不是一个真正的选择,特别是如果一个人需要像可重复读取这样的事务级别。 MARS 提供了连接所需的精确抽象。 SP 中的 AFAIK 可以同时打开任意数量的游标,因此不确定 ADO 连接层的确切问题是什么,以及为什么 MARS 被认为是需要启用的可选功能,而不仅仅是开箱即用的功能。不过,ORM 可以在适用时尝试在幕后使用单独的连接。 EF Core 目前没有。
所以简单回顾一下,如果您不使用延迟加载(可能)并且没有相关集合(不太可能 - 一对多很常见,并且相关集合不一定意味着导航属性和 Include
- 相同适用于对列表和类似成员的预测),那么您不需要 MARS。否则最好启用它们 - 它们是功能,所以使用它。
关于sql-server - 使用 ASP.NET Core 3.0 和 SQL Server 2019+ 时,我什么时候应该使用 MultipleActiveResultSets=True?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59607616/
我试图对 ASP.Net MVC 有一个高层次的理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。 当然,现在
我已经搜索了一段时间,但似乎找不到答案。 我想在我的旋转木马中显示一个计数器,左边是当前项目(工作),左边是项目总数。 我的代码:
. 最佳答案 Scott Gu 称这些为代码块。这就是我的看法。 http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax
我有一个使用 Visual Studio 2010/.net 4/VB 制作的网站。 我真的很喜欢我发现的 FAQ 系统的布局,因为它很简单,但它是经典的 asp。所以,显然,我不能包括我的母版页布局
好吧,对于你们许多人来说,这个问题可能有一个非常明显的答案,但它让我难住了。 我有一个 asp.net Web 表单,上面有两个控件(嗯,不止这两个,但我们将重点关注这些) - 第一个是 asp:dr
当我将 ASP.NET 复选框控件设置为 asp.net 更新面板的异步回发触发器时,EventName 属性是什么? 最佳答案 我相信它是 CheckedChanged。 关于asp.net - a
我有一个用经典 asp 编写的(巨大的)网站。现在我必须切换到 vb.net (razor)。有没有办法将这两个结合起来直到切换完成? 有没有办法让应用程序与经典的 asp 和 vb.net 一起工作
I am creating a products page, where the user selects an option in a radiobuttonlist for example, an
我最近将一个经典的 ASP 应用程序转换为 ASP.NET 3.5,但我觉得我的经典 ASP 版本要快一些(我不知道可能买家会后悔)。 所以你们能帮我解决这个问题吗,让我知道哪个更快,asp、asp.
从本周开始,我被要求开始学习如何使用 ASP 开发网站。我通过 XNA 对 C# 有一定的经验,所以这部分对我来说并不是什么麻烦。 我一直在关注Music Store Tutorial这需要我设置一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我想将一些表单变量发布到经典 ASP 页面中。我不想改变经典的 ASP 页面,因为需要完成大量的工作,以及消耗它们的页面数量。 经典的 ASP 页面需要将表单变量 Username 和 Userpas
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在某种程度上,这可能是一个异端问题。我们有一个大型站点,其中许多页面仍在ASP中。通常,并没有真正动态的,而是包括(通过SSI或Server.Execute)定期重新生成的HTML块。看起来好像是一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有一个遗留的 ASP 应用程序——在不久的某个时候——需要迁移到 ASP.Net 2.0(以与也在 2.0 中的其他应用程序兼容)。 对于这类事情是否有最佳实践,即作为第一步将当前 html、vbs
我目前在一家公司工作,该公司使用 ASP.NET Webforms 和旧 ASP 页面的组合进行 Web 开发。这对于他们当前的项目来说效果很好,但我想说服/建议他们切换到 ASP.NET MVC,因
我有一个经典的 asp 应用程序。我想将该页面的竞赛表格发布到 Asp.Net 表格。原因是我想在进入数据库之前使用我在 Asp.Net 页面中内置的大量逻辑进行验证,而我对 asp 不太了解。更不用
我知道在 ASP.NET MVC 中,您可以拥有移动 View 并执行类似 Index.mobile.cshtml 的操作。和 _Layout.mobile.cshtml并且服务器知道将这些 View
我需要从一些服务器端 c#.net 代码中调用经典 asp 页面上的 VBscript 函数 - 有谁知道一种干净的方法来做到这一点?在 .net 中重写函数不是一种选择。 我会再解释一下这个问题..
我是一名优秀的程序员,十分优秀!