2014-03-03 37 views
4

這可能是我的誤解,但我確實有很大的問題。請考慮以下代碼:我怎樣才能真正關閉sql連接

static void Main(string[] args) 
{ 
    using (SqlConnection con = new SqlConnection(connectionString)) 
    { 
     con.Open(); 
     int i = 10; 
     con.Close(); 
     con.Dispose(); 
    } 
    int y = 10; 
} 

在行int y = 10,放置一個斷點。

現在,轉到您的SQL Server並右鍵單擊與上述代碼中connectionString相同連接的SQl連接,然後選擇「活動監視器」。運行上面的代碼並檢查SQL Server活動監視器。當執行con.Open()時,活動監視器顯示已建立連接。到現在爲止還挺好!但是當光標擊中表示int y = 10;的行時,活動監視器仍然顯示不應該在那裏的連接!因爲我關閉了它,我放棄了它,甚至我也通過了使用聲明。

有誰知道我如何關閉連接?

+8

此行爲很正常,是由於連接池。要立即關閉連接,您必須在連接字符串中禁用連接池,但這會損害性能。 –

+0

添加到邁克爾的評論,看到這個[線程](http://stackoverflow.com/questions/20203117/using-keyword-doesnt-close-an-open-sql-connection) – Andrei

+2

你的'Dispose'調用是不必要的:這是什麼'使用'封裝給你。 – noelicus

回答

8

這是連接池,正確地完成它的工作。在幾乎所有情況下,這都是好東西。如果你不想這樣做:通過連接字符串禁用連接池。

基本上,你需要保持單獨的2個概念:

  • SqlConnection管理連接實例
  • 底層非託管連接對象

在正常使用,關閉或設置所述管理連接只是將非託管連接放回池中,以備快速使用。如果您希望託管和非託管連接一起死亡,則必須禁用連接池。

4

.NET中的數據庫連接默認爲池化。這意味着雖然關閉了一個連接的單個實例(SqlConnection),但該框架實際上會保留基礎實際連接,以便更快地創建新連接。除非你有充足的理由,否則你可能不想惹這個問題,因爲它確實可以提升你的性能。

這就是說,你實際上可以強制池關閉它仍然有的所有連接。您可以使用SqlConnection.ClearPool或者使用更大的錘子與SqlConnection.ClearAllPools做到這一點。因此,真正的連接也會關閉,您的活動監視器將不再顯示連接。

+0

謝謝你,你讓我的一天! – user3375740