数据库连接是否被SqlConnection类的析构函数关闭
本文关键字:析构函数 是否 SqlConnection 数据库连接 | 更新日期: 2023-09-27 18:11:14
如果我丢失了对包含打开的数据库连接的对象的引用,当GC清理我的对象(即通过SqlConnection class
的析构函数)时,连接关闭吗?
还是导致连接泄漏?
在Dispose
中关闭,而不是在析构函数(Finalize
)中。因此,使用using
-语句,您将处于安全的一边。
很难找到文档(不要依赖反编译的程序集),但最后我在SqlConnection.Close
中找到了它:
如果SqlConnection超出作用域,它将不会被关闭。因此,必须通过调用close或Dispose显式地关闭连接。Close和Dispose在功能上是等价的。
…
下面的示例创建一个SqlConnection,打开它,显示一些它的性质。连接在结束时自动关闭.
此外:
谨慎不要在连接上调用Close或Dispose类的Finalize方法中的任何其他托管对象类。在终结器中,您应该只释放非托管资源你的类直接拥有的。如果你的类没有非托管资源时,不要在类中包含Finalize方法定义。
源代码(ILSpy, .NET 4):
// System.Data.SqlClient.SqlConnection
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close(); // <-------
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}