如果我失去對包含與數據庫打開連接的對象的引用,GC是否清理對象(即通過SqlConnection class
的析構函數)時連接是否關閉?數據庫連接是否由SqlConnection類的析構函數關閉?
或者是否導致連接泄漏?
如果我失去對包含與數據庫打開連接的對象的引用,GC是否清理對象(即通過SqlConnection class
的析構函數)時連接是否關閉?數據庫連接是否由SqlConnection類的析構函數關閉?
或者是否導致連接泄漏?
關閉Dispose
不在析構函數中(Finalize
)。因此,請使用using
-statement,並且您處於安全的一方。
這是很難找到文檔(不依賴於反編譯的程序集),但最後我發現它在SqlConnection.Close
:
如果的SqlConnection超出範圍,它不會被關閉。因此, 您必須通過調用Close或Dispose來明確地關閉連接。 Close和Dispose在功能上等同。
....
下面的示例創建一個SqlConnection,打開它,顯示一些 其性質。連接在使用塊的末尾 處自動關閉。
此外:
注意
不要調用關閉或Dispose上一個連接, 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);
}