【问题标题】:How to manage SqlConnection in C# for high frequency transaction?如何在 C# 中管理 SqlConnection 以进行高频交易?
【发布时间】:2022-12-06 22:38:36
【问题描述】:

我有一个高频连接到 SQL Server 数据库的应用程序。在这个服务中,有许多每秒运行的计划任务,每次我都在执行一些查询。

我不明白在这种情况下哪种解决方案更好。

  • 打开单个 SqlConnection 并在应用程序运行时保持打开状态并使用该连接执行所有查询

  • 每次我想执行查询时,打开一个新连接并在查询执行后关闭连接(这个解决方案适用于每 1 秒运行一次的这么多计划任务吗?)

我尝试了第二种解决方案,但还有更好的选择吗?

像 EF 这样的 ORM 如何管理连接?

如您所见,我有很多服务。我不能改变间隔,间隔对我很重要。但是代码进行了如此多的调用,并且我遵循一种更好的方法来管理数据库连接。我也正在与Using Statement建立联系。

【问题讨论】:

  • 定义“更好”。目前,这看起来像是在征求意见,这与 Stack Overflow 无关。
  • 你所说的“资源问题”是什么意思 你所说的其他人不能在应用程序中工作是什么意思?这闻起来像XY Problem
  • “Currently I have a resource problem in SQL Server” 看来这就是您要解决的问题。请发布更多信息,也许我们可以提供帮助

标签: c# .net sql-server performance high-availability


【解决方案1】:

你应该为此使用 SQL 连接池功能。 如果连接需要打开或可以重用,它会在后台自动管理。 文档:https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling?source=recommendations

从该页面复制的示例

using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();
        // Pool A is created.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=pubs"))  
    {  
        connection.Open();
        // Pool B is created because the connection strings differ.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();
        // The connection string matches pool A.  
    }

【讨论】:

  • 我的连接字符串在所有服务中都是相同的。那么线程池的行为是什么呢?这如何管理每个服务的连接?
【解决方案2】:

我假设您已经在“using”语句中或在您的代码中显式打开/关闭 SQL 连接 (try/catch/finally)。如果是这样,您已经在使用连接池,因为它在 ADO.Net 中默认启用(“默认情况下,连接池在 ADO.NET 中启用”)。

因此,我认为您的问题与其说是连接/资源问题,不如说是数据库并发问题。我认为它是 2 个问题之一:

  1. 您的代码对 SQL Server 进行了太多次调用,以至于耗尽了所有可用连接,其他人无法获得连接
  2. 您的代码正在锁定 SQL 中的表,导致其他代码/应用程序超时

    如果是情况 1,请尝试重新设计您的代码,使其对数据库“少说话”。不是每秒进行几次插入/更新,而是缓冲更改并在批处理模式下每 3-5 秒进行一次插入/更新(如果可能的话,obvs)。或者,也许您的 SQL 语句执行时间超过 1 秒,而您每秒调用一次,导致积压情况?

    如果是情况 2,请尝试重新设计 SQL 表,使“读取”应用程序不受“写入”应用程序的影响。通常这涉及一项服务,该服务定期将聚合数据写入只读表以供查看或至少向 select 子句添加“WITH(NOLOCK)”提示以允许脏读(即它不会锁定表以供读取,但可能会导致数据集略微过时,即最终一致性)

    祝你好运

【讨论】:

  • 正如我在问题中所描述的那样,我的问题是第一个,我无法更改执行间隔。我正在遵循一种更好的方式来管理连接
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多