38

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

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

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

4

6 回答 6

49

SqlConnection不,除非必须,否则不要保持静态。线程将是一个问题,但更重要的是 - 通常您根本不需要。使用您提供的代码,内部连接池意味着大多数时候您将在连续调用中获得相同的底层连接(只要您使用相同的连接字符串)。让 pooler 完成它的工作;不理会代码。

这也避免了当您开始拥有两个线程时发生的问题......现在每个线程都可以在自己的连接上工作;使用静态(假设你不使用[ThreadStatic])你必须同步,引入延迟。更不用说重入(即一个线程试图同时使用同一个连接两次)。是的; 不理会代码。现在很好,几乎你所做的任何改变都会让它变得不好。

于 2009-05-14T04:31:00.277 回答
23

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

于 2009-05-14T04:31:06.797 回答
5

在您的代码示例中,无需在连接对象上调用 close() 方法,因为由于代码位于 using 块内,它将自动处理。

于 2009-05-14T04:36:07.783 回答
3

大多数程序员都相信迟开早关。如果每次打开和关闭连接的延迟都会导致整个应用程序变慢,这只是一个问题。

在您使用静态类的情况下,最好每次都打开和关闭连接。

于 2009-05-14T04:30:07.720 回答
1

你正在做最佳实践。仅在您要查询它之前打开它,并尽快关闭它。这种事情一开始可能看起来很浪费,但从长远来看,它实际上会让你的应用程序更具可扩展性。

于 2009-05-14T04:30:32.587 回答
-1

永远不要依赖连接自行关闭。如果没有明确关闭,则会导致性能问题。它发生在我们的项目中。是的,我知道连接是由连接池管理的,但它们仍然必须关闭并返回到池中。

于 2010-04-30T02:21:05.747 回答