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

时间:2010-11-06 02:34:10

标签: 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
    }
}

3 个答案:

答案 0 :(得分:50)

你不应该打开连接。

你应该:

  1. 尽可能晚地打开连接
  2. 尽快关闭连接
  3. 连接本身将返回到连接池。连接是有限且相对昂贵的资源。您建立的完全相同连接字符串的任何新连接都将能够重用池中的连接。

      

    我们强烈建议您永远   你什么时候关闭连接   完成后使用它   连接将返回到   池。你可以使用   关闭或处理方法   连接对象,或通过打开全部   using语句中的连接   在C#中,或在Visual中使用Using语句   基本。没有的连接   可能不会添加明确关闭   或者回到游泳池。更多   信息,请参阅using Statement(C#   参考)或如何:处置a   Visual Basic的系统资源。 Ref

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

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

答案 1 :(得分:8)

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

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

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

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

  

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

     

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

答案 2 :(得分:0)

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