数据库连接是否被SqlConnection类的析构函数关闭

本文关键字:析构函数 是否 SqlConnection 数据库连接 | 更新日期: 2023-09-27 18:11:14

如果我丢失了对包含打开的数据库连接的对象的引用,当GC清理我的对象(即通过SqlConnection class的析构函数)时,连接关闭吗?

还是导致连接泄漏?

数据库连接是否被SqlConnection类的析构函数关闭

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);
}