C# 我应该在何时打开和关闭与SQL Server的连接

C# 我应该在何时打开和关闭与SQL Server的连接,c#,.net,sql,data-binding,sqlconnection,C#,.net,Sql,Data Binding,Sqlconnection,我有一个简单的静态类,其中包含一些方法。这些方法中的每一个都打开一个SqlConnection,查询数据库并关闭连接。这样,我确信我总是关闭与数据库的连接,但另一方面,我不喜欢总是打开和关闭连接。下面是我的方法的示例 public static void AddSomething(string something) { using (SqlConnection connection = new SqlConnection("...")) { connection.

我有一个简单的静态类,其中包含一些方法。这些方法中的每一个都打开一个SqlConnection,查询数据库并关闭连接。这样,我确信我总是关闭与数据库的连接,但另一方面,我不喜欢总是打开和关闭连接。下面是我的方法的示例

public static void AddSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();
        // ...
        connection.Close();
    }
}

考虑到这些方法在一个静态类中,我应该有一个包含单个SqlConnection的静态成员吗?我该如何以及何时放弃它?最佳实践是什么?

大多数程序员都相信延迟打开和提前关闭。只有当每次打开和关闭连接的延迟导致整个应用程序速度减慢时,这才是一个问题


对于静态类,每次打开和关闭连接可能是最好的选择。

您正在进行最佳实践。只在您要查询它之前打开它,并尽快关闭它。这种事情一开始可能看起来很浪费,但从长远来看,它实际上使您的应用程序更具可伸缩性。

不,除非必须,否则不要保持静态的
SqlConnection
。线程将是一个问题,但更重要的是-通常你根本不需要。对于所展示的代码,内部连接池意味着在大多数情况下,您将在连续调用中获得相同的基础连接(只要使用相同的连接字符串)。让池工做自己的工作;别管代码了


这也避免了当你开始有两个线程时会发生什么问题。。。现在每个人都可以在自己的连接上工作;使用static(假设您不使用
[ThreadStatic]
)时,您必须进行同步,从而引入延迟。更不用说重入(即一个线程试图同时使用同一个连接两次)。是的;别管代码了。现在一切正常,几乎您所做的任何更改都会使它变得不正常。

因为当您调用Open()和Close()时,SqlConnection有一个连接池,您实际上并没有打开和关闭与服务器的物理连接。您只是从可用连接池中添加/删除连接。因此,最好的做法是在执行命令后尽可能晚地打开连接并尽早关闭连接。

在代码示例中,不需要调用close()方法,因为由于代码驻留在using块中,它将被自动处理。

永远不要依赖连接来关闭自身。如果没有显式关闭,将导致性能问题。这件事发生在我们的项目上。是的,我知道连接是由连接池管理的,但它们仍然必须关闭并返回到连接池。

这只适用于甚至可以扩展的情况。例如,对于具有嵌入式数据库的应用程序,将应用不同的考虑因素。+1抵消否决票。即使是池式重新打开也会导致对sp_resetconnection的调用,这会导致一些(即使很小)延迟。他在SqlConnection周围有一个“正在使用”的调用,所以一旦连接完成,它应该处理掉。说得好!