未封闭的数据库连接会发生什么?

时间:2009-06-19 14:42:47

标签: .net database-connection

今天早些时候我在我们的一个项目中发现了一个错误 - 与数据库的连接永远不会被关闭,我的意思是从不调用Close()方法。但是,当我关闭应用程序时,连接已关闭(在sql管理工作室中多次检查)。为什么呢?

4 个答案:

答案 0 :(得分:4)

应用程序退出时,连接将关闭。阅读SqlConnection's Finalize。来自MSDN的Object.Finalize文档:

“在关闭应用程序域期间,会自动调用Finalize,这些对象不会被终结,即使是那些仍然可以访问的对象。”

答案 1 :(得分:2)

另外要记住的是,在.Net中,您可以将连接包装在一个使用块中,这将关闭并为您配置连接。因此,如果你在那里使用了块,那么缺少一个明确的Close()并不是一件坏事......

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

这是在finally中使用conn.close的try / finally块的功能等价物。许多开发人员忽略了使用块 - 确保在这种情况下你没有做同样的事情。

如果您重写代码以关闭连接 - 最好在所有数据库对象(连接,命令,阅读器)周围使用块来确保它们在超出范围时关闭和处理使用块。我肯定建议将这些内容写入您的代码,而不仅仅是conn.Close()。

答案 2 :(得分:1)

SQL连接的创建成本很高,ADO.NET使用一种称为连接池的技术,允许重用它们。

引自MSDN

  

强烈建议您   你总是关闭连接   完成使用它以便它会   返回连接池并且   被重用。

     

如果最大池大小已经存在   到达,没有可用的连接   可用,请求排队。该   然后pooler试图收回任何   连接直到超时   达到(默认为15秒)。   如果捣蛋鬼不能满足   在连接时间之前请求   out,抛出异常。

答案 3 :(得分:1)

当您以常规方式退出应用程序时,我希望终结器能够运行。如果连接仍处于打开状态,它们将关闭连接。 只是不要依赖于此:在应用程序的正常运行中运行这些终结器可能需要一段时间,因此您将保持太多连接打开。

当应用程序崩溃时,终结器可能无法运行,使连接在应用程序的生命周期内保持打开状态。