【问题标题】:How to keep single SQL Server connection instance open for multiple request in C#?如何保持单个 SQL Server 连接实例在 C# 中为多个请求打开?
【发布时间】:2023-04-02 16:01:01
【问题描述】:

我有一个 Web API,其中包含 C# 中的数据库插入逻辑 (ado.net)。当多个用户(例如 100 个用户)调用 Web API 时,每次为多个请求打开和关闭 SQL Server 连接时。它会降低性能。

如何让单个 SQL Server 连接同时处理多个请求?我必须保持 SQL 连接只打开一次并在一段时间后关闭,以便在此期间它应该考虑多个请求并在数据库中插入记录。

请提出建议。

【问题讨论】:

  • 您如何确认这会影响性能。 SQL 连接池是高度优化的。并且尝试自己管理连接池是一个众所周知的坏主意。为什么你认为你可以比现在更好地优化它?您测量的哪些性能指标表明这是瓶颈?
  • .Net 使用连接池来优化此场景,在需要时打开/关闭/处理连接,这是最佳实践。
  • 你怎么知道连接打开和关闭是需要时间的?你做过性能测试吗?该测试的代码在哪里?你使用的代码在哪里?
  • 当你关闭一个连接时,它只是释放它以供在池中使用,它实际上并没有在数据库服务器上关闭它,它是 ADO.Net 内部的。
  • ASP.Net 请求-响应不会发生在其自己的隔离进程中,而是发生在工作进程(应用程序池)中的线程上,这意味着连接池可用于应用程序中的所有会话。

标签: c# .net sql-server ado.net


【解决方案1】:

ADO.NET 的SqlConnection 正在实现一个连接池。 这意味着当您关闭或处置SqlConnection 的实例时,底层连接只是返回到池中。当SqlConnection 的另一个实例打开,并且连接池中有可用的连接时,将使用该连接。
事实上,SQL Server Connection Pooling 上的 Microsoft 文档页面明确指出:

注意
我们强烈建议您在使用完连接后始终关闭连接,以便将连接返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法,或者通过在 C# 中的 using 语句或 Visual Basic 中的 Using 语句中打开所有连接来执行此操作。未明确关闭的连接可能不会添加或返回到池中。有关详细信息,请参阅使用语句或如何:处置 Visual Basic 的系统资源。

这意味着使用SqlConnection 的最佳实践方式是这样的:

using(var con = new SqlConnection(connectionString))
{
    // your sql stuff goes here...
}

顺便说一句,SqlCommandSqlDataReaderSqlDataAdapter 也实现了 IDisposable 接口,因此它们也需要在 using 语句的上下文中使用:

using(var con = new SqlConnection(connectionString))
{
    using(var cmd = new SqlCommand(sql, con))
    {
        // prepare command here - parameters and stuff like that

        // either
        using(var reader = cmd.ExecuteReader())
        {

        }

        // or 
        using(var adapter = new SqlDataAdapter(cmd))
        {

        }

    }
}

【讨论】:

  • 谢谢佐哈尔。但它仅适用于可能包含多个 sql 连接打开/关闭场景的当前进程。我希望单个 sql 连接在 c# 中用于多个请求(> 100 次调用 web api 意味着每次不同的进程)。如果我错了,请纠正。
  • @user2638841 请参阅 this comment Alex K 提出的问题。
【解决方案2】:

这很简单,您只需保持连接打开,如果有任何阅读器打开,它们就会关闭。

var con = new SqlConnection("Your connection String");
   con.open();
   //your code
con.close()//after you have done your executions

您是否尝试过 Linq。它做你想做的事情,它使连接保持活跃,我认为这对你来说会更容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多