今天早些时候我在我们的一个项目中发现了一个错误 - 与数据库的连接永远不会被关闭,我的意思是从不调用Close()方法。但是,当我关闭应用程序时,连接已关闭(在sql管理工作室中多次检查)。为什么呢?
答案 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)
当您以常规方式退出应用程序时,我希望终结器能够运行。如果连接仍处于打开状态,它们将关闭连接。 只是不要依赖于此:在应用程序的正常运行中运行这些终结器可能需要一段时间,因此您将保持太多连接打开。
当应用程序崩溃时,终结器可能无法运行,使连接在应用程序的生命周期内保持打开状态。