2012-02-03 72 views
1

可能重複:
Entity framework 4 not closing connection in sql server 2005 profiler爲什麼我的使用語句不關閉連接?

好了,很多對計算器的開發者說,我不應該擔心收我的連接:我使用的語句將關閉我的連接,herehere和遍佈整個網站。不幸的是,我沒有看到它發生。這裏是我的代碼:

[Test, Explicit] 
    public void ReconnectTest() 
    { 
     const string connString = "Initial Catalog=MyDb;Data Source=MyServer;Integrated Security=SSPI;Application Name=ReconnectTest;"; 
     for (int i = 0; i < 2000; i++) 
     { 
      try 
      { 
       using (var conn = new SqlConnection(connString)) 
       { 
        conn.Open(); 
        using (var command = conn.CreateCommand()) 
        { 
         command.CommandText = "SELECT 1 as a"; 
         command.CommandType = CommandType.Text; 
         command.ExecuteNonQuery(); 
        } 
        //conn.Close(); 
// optional breakpoint 1 below 
        } 
       } 
       catch(SqlException e) 
       { 
// breakpoint 2 below 
        Console.WriteLine(e); 
       } 
// breakpoint 3 below 
      } 
     } 

當我讓所有的斷點,並開始我的測試,在第一次迭代成功,和我打了斷點3.此時,連接仍然是開放的:我看到它的探查,並且sp_who2也輸出它。

讓我們假設在這個時候我出去吃午飯,而我的連接是空閒的。因此,我們的生產服務器將其殺死。爲了模仿它,我正在扼殺SSMS的聯繫。

因此,當我點擊F5並運行第二次迭代時,我的連接被終止。不幸的是,它不會自動重新打開,因此ExecuteNonQuery將引發以下異常:「發生傳輸級錯誤」。當我運行第三次迭代時,我的連接實際上打開了:我將其視爲Profiler中的事件,並且sp_who2也將其輸出。

即使當我取消註釋我的conn.Close()命令時,連接仍然沒有關閉,並且當我從SSMS中取消它時,下一次迭代仍然爆炸。

我錯過了什麼?爲什麼不能使用語句關閉我的連接?爲什麼不能Open()實際上第一次打開它,但下一次成功?

當你調用SqlConnection.Dispose(),你因爲using塊呢,連接不會關閉,每本身這個問題,源自my previous one

+1

[連接池](http://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.80).aspx) – Blorgbeard 2012-02-03 18:21:28

+0

這是一個預期的行爲請閱讀[連接重用/池]( http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) – 2012-02-03 18:23:30

回答

1

。這是釋放回連接池的

爲了避免不斷建立/拆除連接,連接池將保持連接打開供您的應用程序使用。因此,連接仍然顯示爲開放是非常合理的。

之後發生了什麼,我不能非正式解釋 - 我知道保持隨機連接打開而不是因爲您的應用程序當然可以創建多個併發連接。

+1

是的,解釋它。謝謝! – 2012-02-03 19:03:02

相關問題