为什么总是要关闭数据库连接?

49

如果连接数据库会消耗大量资源,为什么在应用程序中每次都必须关闭数据库连接,如果需要再次打开呢?我是否可以在整个应用程序中全局地重复使用这个连接,让其他类和方法也能够复用它呢?

例如(伪代码):

public class PopulateGridViews()
{
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE");
    conn.Open();

    void PopulateGrid1()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid1
    }

    void PopulateGrid2()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid2
    }
}

我建议阅读SQL Server连接池(ADO.NET) - Christopher Painter
3个回答

68

不应该保持连接处于开放状态。

您应该:

  1. 尽可能晚地打开连接
  2. 尽快关闭连接

连接本身将返回到连接池中。连接是一种有限且相对昂贵的资源。任何您建立的具有完全相同的连接字符串的新连接都可以重用池中的连接。

我们强烈建议您在使用完连接后始终关闭连接,以便连接将返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法、在 C# 中使用 using 语句块或在 Visual Basic 中使用 Using 语句块来实现此目的。未明确关闭的连接可能不会被添加或返回到池中。有关更多信息,请参见 using Statement (C# Reference) 或 How to: Dispose of a System Resource for Visual Basic。Ref

您应该适当地将任何实现IDisposable的对象包装在using语句块中:

 using (SqlConnection connection = new SqlConnection(connectionString))
 {
     connection.Open();

     ...

     command.ExecuteNonQuery();
 }

如果连接过程中出现错误,我应该在哪里放置我的catch? - yonan2236
1
如果您像@Mitch Wheat建议的那样使用using块,如果出现错误,它将自动关闭。 - David
那么就没有办法确定发生了哪些错误吗? - yonan2236
不。您可以(也应该)将连接打开和执行命令放在try语句中。无论如何,您都需要为用户体验做到这一点。我并不主张不当的错误处理。我只是说,如果您使用“using”命令,连接将被关闭。个人而言,我总是将打开和命令执行放在'try'块中,并将connection.Close()调用放在'finally'块中。 - David
4
如果你愿意的话,可以尝试将其放在应用程序中更高的位置。使用方式类似于try-finally,因此实际异常不被捕获,而是继续传递。 - Skurmedel
1
如果从法国到牙买加建立连接并关闭,并且该连接在连接池中,则可以正确地假设除了发送数据之外不需要进行任何通信吗? - Damien Golding

13

因为(一些)数据库直到被调用的应用程序告知关闭连接之前都会保持开放状态。如果对数据库进行数百次调用,那么它将保持100个开放连接以占用资源。在繁忙的应用程序中,对数据库进行成千上万次的调用并不罕见,而数据库性能迟早会影响应用程序的性能。

这其实只是常识。如果你有充分理由保持连接打开状态,那么就保持。否则,在完成操作后立即关闭它。但最好养成关闭连接的好习惯,这样当你没有打算保持它们开放时,也不会遗漏掉任何一个。这就像系安全带或关冰箱门时养成的好习惯一样。

即使这篇文章已经有点过时,但它表达了这个观点:

托管公司普遍存在的一个问题是 ASP 网站在打开数据库连接后没有关闭它们。这是一个基本步骤,你应该认为它是强制性的代码部分。如果你不关闭数据库连接,许多问题可能会发生,如网页挂起、页面加载缓慢等。

把它看作走进自己家门。也许门会自动关闭,但也许不会。如果门没有关好,谁知道会发生什么事。如果你住在乡村,可能会有熊走进来。如果你住在城市里,可能会有抢劫犯进来。好吧,也许让数据库连接保持开放状态不会导致那么糟糕的后果,但它确实会给你和你的托管公司带来很多不必要的麻烦。

这篇文章传达了一个很重要的信息:对于打开的数据库连接,我们应该养成关闭它们的好习惯,以避免出现性能问题和其他潜在的风险。

参考链接:http://www.bewebmaster.com/84.php


1
我们在工作中接手了一个应用程序,它泄漏连接,这很不好 :( 一段时间后,SQL Server停止响应新的连接。这也意味着每个其他应用程序都停止工作了。 - Skurmedel

0

如果您不关闭连接,那么它会持续消耗您的资源,对您的应用程序产生整体影响,并且可能无法添加或返回到池中。


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