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

yon*_*236 36 c# optimization database-connection

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

例如(伪代码):

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Mit*_*eat 51

你不应该打开连接.

你应该:

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

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

我们强烈建议您在使用完毕后始终关闭连接,以便将连接返回到池中.您可以使用Connection对象的Close或Dispose方法,或打开C#中using语句内的所有连接,或Visual Basic中的Using语句来执行此操作.未显式关闭的连接可能不会添加或返回到池中.有关更多信息,请参阅使用Statement(C#参考)或如何:为Visual Basic配置系统资源. 参考.

你应该适当地包装IDisposableusing语句块中实现的任何东西:

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

     ...

     command.ExecuteNonQuery();
 }
Run Code Online (Sandbox Code Playgroud)

  • @ yonan2236,你可以尝试一下,如果你喜欢,例如在应用程序中更高.使用就像一个try-finally,所以实际的异常没有被捕获,它会传播. (4认同)

Dav*_*vid 10

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

这真的只是常识.如果您有正当理由将其保持打开状态,请执行此操作.如果没有,请在完成后立即将其关闭.但最好是养成关闭连接的好习惯,这样你就不会在不打算时将它们打开.这是一个很好的习惯,比如你不带食物时要戴上安全带或关上冰箱门.

本文陈述得很好(即使它有点过时):

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

托管公司的一个常见问题是ASP网站在打开后不会关闭数据库连接.这是您应该考虑成为强制性代码一部分的基本步骤.如果不关闭数据库连接,则会出现许多问题,例如网页挂起,页面加载速度慢等等.

把它想象成穿过你家的大门.也许门会自动关闭,但也许不会.如果它没有关闭,谁知道会发生什么.如果你住在这个国家,一只熊可以走进去.如果你住在这个城市,一个抢劫者可以走进去.好吧,好吧,也许保持数据库连接打开不会导致任何坏事,但它会导致你和你的托管公司都有很多不必要的麻烦.