如何在C#中为多个请求保持单个SQL Server连接实例的打开状态?

如何在C#中为多个请求保持单个SQL Server连接实例的打开状态?,c#,.net,sql-server,ado.net,C#,.net,Sql Server,Ado.net,我有一个Web API,其中包含C#中的数据库插入逻辑(ado.net)。当多个用户(例如100个用户)调用Web API时,每次打开和关闭SQL Server连接时,都会出现多个请求。这会降低性能 如何为多个请求保持单个SQL Server连接的活动状态?我必须保持SQL连接只打开一次,并在一段时间后关闭,以便在此期间它应该考虑多个请求并在数据库中插入记录。 请建议 ADO.NET的SqlConnection正在实现一个连接池。 这意味着,当您关闭或处置SqlConnection的实例时,基础

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

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

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

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

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

using(var con = new SqlConnection(connectionString))
{
    // your sql stuff goes here...
}
顺便说一句,
SqlCommand
SqlDataReader
SqlDataAdapter
也实现了
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))
        {

        }

    }
}

很容易,你只需要保持连接打开,如果有任何读卡器打开,它们就会关闭

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

你试过林克吗。它做的事情与您想要的一样,它使连接保持活跃,我认为这对您来说会更容易

您如何确认这会影响性能。SQL连接池得到了高度优化。而试图自己管理连接池是一个众所周知的坏主意。为什么你认为你可以比现在更好地优化它?您测量的性能指标表明瓶颈在哪里?.Net使用连接池优化此方案,在需要时打开/关闭/处置连接,这是最佳做法。您如何知道打开和关闭连接需要时间?你做了性能测试吗?那个测试的代码在哪里?您使用的代码在哪里?当您关闭一个连接时,它只是将其释放以在池中使用,实际上它不会在数据库服务器上关闭它,它是ADO.Net内部的。ASP.Net请求响应不会发生在它自己的独立进程中,而是发生在工作进程(应用程序池)中的线程上这意味着连接池可用于应用程序中的所有会话。谢谢Zohar。但它只适用于可能包含多个sql连接打开/关闭场景的当前进程。我希望单个sql连接能够在c#中处理多个请求(>100次对web api的调用意味着每次不同的进程)。如果我错了,请更正。@user2638841请注意亚历克斯K提出的问题。