SqlConnection类的析构函数会关闭数据库连接吗?

3
如果我失去了包含与数据库的打开连接的对象的引用,当GC清理我的对象时(即通过SqlConnection类的析构函数),连接是否关闭?
还是会导致连接泄漏?
1个回答

5
Dispose中关闭,而不是在析构函数(Finalize)中关闭。因此,请使用using语句,这样就更加安全了。
很难找到文档(不要依赖反编译的程序集),但最终我在SqlConnection.Close中找到了:
如果SqlConnection超出范围,它将不会被关闭。因此,您必须显式地通过调用CloseDispose来关闭连接。CloseDispose在功能上是等效的。
以下示例创建一个SqlConnection,打开它,显示一些属性。连接将在using块结束时自动关闭。
此外:
注意
不要在类的Finalize方法中调用CloseDispose,也不要在该方法中调用连接、数据读取器或其他托管对象。在终结器中,您应该只释放直接拥有的非托管资源。如果您的类不拥有任何非托管资源,则不要在类定义中包括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);
}

这个箭头 <------- 表示不要这样做吗? - Allen
@Allen,这只是表明如果使用using语句关闭连接,则会调用dispose。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接