DB连接是否被SqlConnection类的析构函数关闭?

时间:2014-07-03 14:54:41

标签: c# ado.net sqlconnection

如果我丢失了对包含与数据库的开放连接的对象的引用,那么当GC清理我的对象时(即SqlConnection class的析构函数),连接是否已关闭?

或是否导致连接泄漏?

1 个答案:

答案 0 :(得分:5)

它在Dispose中关闭,而不是在析构函数(Finalize)中关闭。因此,请使用using - 语句,这样做是安全的。

很难找到文档(不依赖于反编译程序集)但最后我在SqlConnection.Close中找到了它:

  

如果SqlConnection超出范围,则不会关闭。因此,   您必须通过调用Close或Dispose 显式关闭连接。   关闭和处置在功能上是等效的。

...

  

以下示例创建一个SqlConnection,打开它,显示一些   它的属性。连接最后会自动关闭   使用块

此外:

<强>注意

  

不要在连接上调用关闭或处理,a   DataReader,或者你的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);
}