2009-06-19 184 views
5

我懷疑在我們的應用程序中使用的數據庫連接並不總是關閉。我去看代碼,我發現有一個DataProvider類,它有SqlConnection對象。連接在這個類的構造函數中打開,並關閉它的Dispose方法(不要斷定,我知道保持開放連接是邪惡的,它只是不是我的代碼,它不是問題的關鍵)。該Dispose方法來實現這樣的:在Dispose方法中關閉數據庫連接是否正確?

protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      if (_conn != null) 
       _conn.Close(); 
     } 

     _disposed = true; 
    } 
} 

的問題是:
是否始終保證連接被關閉?
這段代碼對嗎?

我認爲應該有_conn.Dispose()叫 - 我是對的,它可能會影響不關閉連接(可能不是)?

+0

如果您懷疑使用性能計數器進行檢查確認。 – RichardOD 2009-06-19 08:05:05

+0

要檢查的關鍵值是NumberOfPooledConnections。 – RichardOD 2009-06-19 08:08:16

回答

8

處理決不會自動調用。

連接不會被關閉,直到你的對象的Dispose方法被顯式調用,或者如果你的類中使用的使用()塊

一個更安全的方法是調用Dispose方法在你的終結和確保在調用Dispose方法時終止器被抑制。

This article目前實現該模式

希望它可以幫助正確的方法!

Cédric

2

conn.Dispose();也會關閉連接,所以不能傷害它改變它遵循配置模式。

但是在功能上等價,所以必須有其他問題。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

如果SqlConnection的超出 範圍,它不會被關閉。因此, 您必須通過調用Close或 Dispose來明確關閉 連接。 Close and Dispose在功能上等同於 。如果 連接池值設置爲true或是,則將底層 連接返回到連接池 連接池 。另一方面,如果 池設置爲false或否, 底層連接到服務器是關閉 。