今天早些时候,我在我们的一个项目中发现了一个bug - 数据库连接从未关闭,我的意思是Close()方法从未被调用。然而,当我关闭应用程序时,连接会被关闭(在SQL管理工具中多次检查)。为什么会这样呢?
今天早些时候,我在我们的一个项目中发现了一个bug - 数据库连接从未关闭,我的意思是Close()方法从未被调用。然而,当我关闭应用程序时,连接会被关闭(在SQL管理工具中多次检查)。为什么会这样呢?
还有一件需要记住的事情是,在 .Net 中,您可以将连接包装在 using 块中,这样会为您关闭和处理连接。因此,如果您已经使用了 using 块,那么缺少显式的 Close() 并不是一件坏事...
// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
conn.Open();
// database code here with no explicit close
}
SQL 连接创建的成本很高,ADO.NET 使用一种称为连接池的技术来重用它们。
引自 MSDN 的一句话:
强烈建议您在使用完毕后始终关闭连接,以便将其返回到连接池并重用。
如果已达到最大池大小且没有可用连接,则请求将被排队。然后池管理器尝试回收任何连接,直到达到超时时间(默认为 15 秒)。如果池管理器在连接超时之前无法满足请求,则会抛出异常。
当您正常退出应用程序时,我期望 finalizers 能够运行。如果连接仍然打开,它们将关闭该连接。 但是不要依赖此功能:在应用程序正常操作中,finalizers 运行可能需要一些时间,因此您将保持过多的打开连接。
当应用程序崩溃时,可能 finalizer 不会运行,从而使连接超出应用程序生命周期而保持打开状态。