2008-11-24 50 views
5

我在連接字符串中使用Transaction Binding=Explicit Unbind作爲建議here因爲我也使用TransactionScope超時。問題在於連接在處置後似乎並沒有關閉,並且最終在連接池中沒有更多連接可用。當我修改TransactionTimeoutIssueDemo(請參閱鏈接)並在循環中運行TransactionScopeTest()(使用顯式的非綁定連接字符串)足夠多次以用完連接池中的所有可用連接時,我得到了相同的結果。池中連接的默認值爲100,但可以通過使用設置Max Pool Size =10進行更改。看起來,即使SqlConnection和TransactionScope與using子句一起使用,在使用顯式解除綁定時連接也不會被釋放。任何人都知道如何處理這個?使用Transaction Binding = Explicit Unbind時連接不會關閉;在連接字符串

回答

3

連接似乎只停留在池中,並且在出現異常時不會重用,就像示例一樣。如果增加超時時間,連接將被重新使用。

一種解決這個問題的方法來清除連接池的情況下,你會得到這樣一個例外:

using (SqlConnection con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 
    try 
    { 
     Console.WriteLine("Server is {0}", con.ServerVersion); 
     Console.WriteLine("Clr is {0}", Environment.Version); 
     for (int i = 0; i < 5; i++) 
     { 
      using (SqlCommand cmd = con.CreateCommand()) 
      { 
       cmd.CommandText = "insert into TXTEST values (" + i + ")"; 
       cmd.ExecuteNonQuery(); 
      } 
      Console.WriteLine("Row inserted"); 
     } 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
    catch 
    { 
     SqlConnection.ClearPool(con); 
     throw; 
    } 
} 

在大多數情況下,該交易將在超時時間內完成,一切都會好得很。當事務實際上做超時您清除池以清理不會重用的髒連接。這當然會影響池中不受此問題影響的其他連接。

這是一個醜陋的解決方法,但它似乎工作。

0

對於它的價值,這個問題在.Net 4.0中得到了修復。