如果我丢失了对包含与数据库的开放连接的对象的引用,那么当GC清理我的对象时(即SqlConnection class
的析构函数),连接是否已关闭?
或是否导致连接泄漏?
答案 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);
}