何时应该打开和关闭与 SQL Server 的连接?

40

我有一个简单的静态类,其中有几个方法。这些方法中每一个都会打开SqlConnection,查询数据库并关闭连接。这样,我可以确保始终关闭到数据库的连接,但另一方面,我不喜欢总是打开和关闭连接。下面是我的方法示例:

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

考虑到这些方法都在一个静态类中,我是否应该有一个静态成员来包含一个单独的SqlConnection?我应该在何时及如何释放它?有哪些最佳实践?

6个回答

51
不要保留静态的SqlConnection,除非你必须这样做。线程可能是一个问题,但更重要的是 - 通常你根本不需要这样做。按照您提供的代码,内部连接池意味着大多数时候您将在连续调用中获得相同的底层连接(只要使用相同的连接字符串)。让池程序员去完成他的工作;别管代码。
这也避免了当你开始有两个线程时会出现什么问题......现在每个线程都可以在自己的连接上进行工作;使用静态(假设你不使用[ThreadStatic])你必须同步,引入延迟。更不用说重入性了(即单线程尝试同时使用相同的连接两次)。对的,别管代码。它现在很好,几乎任何改变都会使它变得不好。

26

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


说得非常好! - Jessica

5

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


3

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

在使用静态类时,最好每次打开和关闭连接。


2
+1 用于抵消负评。即使是池化的重新打开也会导致调用 sp_resetconnection,这会产生一些(即使很小)延迟。 - Andomar

1

你正在实践最佳的编程规范。只有在查询之前打开它,并尽快关闭它。这种做法一开始可能看起来浪费,但实际上可以使你的应用程序在长期内更具可扩展性。


这仅适用于可扩展性是可能的情况。例如,对于嵌入式数据库的应用程序,将适用不同的考虑因素。 - Matthew Flaschen

-1

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


他在 SqlConnection 周围使用了 'using' 调用,因此一旦完成,它应该处理连接。 - andrewm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接