为啥总是关闭数据库连接?

Posted

技术标签:

【中文标题】为啥总是关闭数据库连接?【英文标题】:Why always close Database connection?为什么总是关闭数据库连接? 【发布时间】:2011-05-05 22:12:17 【问题描述】:

如果连接到数据库会消耗大量资源,那么如果必须再次打开数据库连接,为什么还要在应用程序中关闭它?我可以让这个连接在我的整个应用程序中全局可用,以便其他类和方法可以重用它吗?

例如(在伪代码中):

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 Connection Pooling (ADO.NET)。 【参考方案1】:

很明显,如果您不关闭连接,它将持续消耗您的资源,这将对您的应用产生整体影响,并且它也可能不会被添加或返回到池中。

【讨论】:

【参考方案2】:

您不应该让连接保持打开状态。

你应该:

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

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

我们强烈建议您始终 关闭连接 完成使用它,以便 连接将返回到 水池。您可以使用 的 Close 或 Dispose 方法 连接对象,或通过打开所有 using 语句中的连接 在 C# 中,或 Visual 中的 Using 语句 基本的。非连接 可能不会添加显式关闭 或返回池中。更多 信息,请参阅 using 语句(C# 参考)或如何:处置 Visual Basic 的系统资源。 Ref.

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

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

     ...

     command.ExecuteNonQuery();
 

【讨论】:

如果连接过程中出现一些错误,我应该把我的catch放在哪里? 如果你使用@Mitch Wheat建议的using块,如果出现错误会自动关闭。 所以没有办法确定知道发生的错误? @yonan2236,如果您愿意,可以尝试一下,例如在应用程序的更高位置。 using 就像一个 try-finally,所以实际的异常不会被捕获,它会继续传播。 如果从法国到牙买加的连接建立然后关闭并且它在连接池中,那么假设除了发送数据之外不需要通信是否正确?【参考方案3】:

因为(某些)数据库也会保持打开连接,直到调用应用程序告知关闭它。如果您收到数百个对数据库的调用,那么它就坐在那里,有 100 个打开的连接占用资源。在繁忙的应用程序中对数据库进行数千或数十万次调用并不少见,数据库性能迟早会扼杀应用程序的性能。

这真的只是常识。如果您有正当理由保持打开状态,请这样做。如果没有,请在完成后立即关闭它。但是最好养成关闭连接的好习惯,这样你就不会在不打算这样做时让它们保持打开状态。这是一个好习惯,比如在你不拿食物的时候系上安全带或关上冰箱门。

这篇文章说得很好(虽然有点过时了):

http://www.bewebmaster.com/84.php

托管之间的一个常见问题 公司是 ASP 网站没有 之后关闭数据库连接 他们被打开了。这是一个基本步骤 你应该考虑成为其中的一部分 强制性代码。如果不关闭 你的数据库连接,很多 可能会出现问题,例如网页 挂起、页面加载缓慢等等。

把它想象成穿过一扇门 你的房子。也许门会关上 本身,但也许不会。如果它 没有关闭,谁知道会发生什么 发生。如果你住在乡下, 熊可以走进来。如果你住在 城市,一个抢劫犯可以走进来。好吧, 好吧,也许离开数据库 连接打开不会导致任何事情 那不好,但会导致很多 给您和您带来不必要的头痛 您的托管公司。

【讨论】:

我们在工作时继承了一个应用程序泄漏连接,这不太好:( 一段时间后 SQL Server 停止响应新连接。这也意味着所有其他应用程序都停止工作。

以上是关于为啥总是关闭数据库连接?的主要内容,如果未能解决你的问题,请参考以下文章

为啥ERP的交换数据库连接测试总是失败

为啥连接不到本机的mongodn数据库,总是报connect fail的错

为啥我们需要 JDBC 的连接池? [关闭]

当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?

为啥hibernate关闭连接后h2的数据库文件仍然会被锁定一段时间?

为啥“Quarkus”选择“Agroal”而不是“HikariCP”作为首选数据源和连接池实现? [关闭]