【问题标题】:How many concurrent statements does SqlConnection supportSqlConnection 支持多少并发语句
【发布时间】:2020-05-06 16:13:43
【问题描述】:

C#SqlConnection 支持多少并发语句?

假设我正在开发运行 10 个线程的 Windows 服务。所有线程使用相同的SqlConnection 对象但不同的SqlCommand 对象,并在不同的表或相同的表但不同的数据上执行选择、插入、更新和删除等操作。它会起作用吗?单个 SqlConnection 对象能否同时处理 10 个语句?

【问题讨论】:

  • 我认为答案很简单一个。 AFAIK SqlConnection 类不是线程安全的。

标签: c# sql-server multithreading sqlconnection sqlcommand


【解决方案1】:

C# SqlConnection 支持多少并发语句?

从技术上讲,您可以有多个“正在运行”的语句,但只有一个正在执行。

单个 SqlConnection 映射到 SQL Server 中的单个连接和会话。在 Sql Server 中,一个会话一次只能有一个 request 处于活动状态。如果启用 MultipeActiveResultsets,您可以在前一个查询完成之前启动一个新查询,但语句是交错的,永远不会并行运行。

MARS 允许在一个内交错执行多个请求 单连接。也就是说,它允许批处理运行,并且在其范围内 执行,它允许其他请求执行。但是请注意, MARS 是根据交错来定义的,不是是根据并行来定义的 执行。

只能在明确定义的点切换执行。

https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver15

因此,您甚至不能保证当一个语句被阻塞时另一个语句会运行。所以如果你想并行运行语句,你需要使用多个SqlConnections。

另请注意,单个查询可能使用并行执行计划,并有多个 tasks 并行运行。

【讨论】:

  • 使用队列/出队的多个连接或单个连接(取决于预期获得的负载类型)
【解决方案2】:

大卫·布朗 (David Browne) 给出了问题的答案,但您可能还需要了解其他信息:

假设我正在开发运行 10 个线程的 Windows 服务。所有线程使用相同的 SqlConnection 对象但使用不同的 SqlCommand 对象,并在不同的表或相同的表但不同的数据上执行选择、插入、更新和删除等操作。

这种设计在几个方面似乎都是错误的:

  1. 您保留一个一次性资源并打开。我对 Disposeable 东西的规则是:“创建。使用。处理。全部在同一段代码中,最好使用 using 块。”保留可丢弃的东西,甚至在线程之间共享它是不值得忘记关闭它的危险。

没有性能优势:SqlConnection 使用内部连接池,没有任何副作用。即使有is a relevant speed advantage,他们也不值得冒险。

  1. 您正在使用多线程和数据库访问。多线程是实现多任务处理的一种方法,但在需要之前不应该使用它。多线程仅对 CPU 密集型工作有用。否则,您通常应该使用 async/await 或类似的方法。数据库操作是磁盘或网络绑定的。

此规则有一个例外,那就是如果您的应用程序是服务器。服务器是pleasingly parallel 的罕见例子。所以有一个大的线程池来并行处理传入的请求是很常见的。但是,您编写其中之一是相当罕见的。大多数情况下,您只需在处理该问题的现有服务器基础架构中运行您的代码。

  1. 如果您确实有繁重的 CPU 工作,那么您很可能会占用大量资源。检索很多内容,然后在 C# 代码中进行过滤,这是一个非常常见的初学者错误。不要那样做。在 Query 中尽可能多地进行过滤和处理。您将无法超越 DB-Server 的速度,而且充其量只会毫无意义地占用您的网络。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多