2008-11-24 10 views
5

Ich verwende Transaction Binding=Explicit Unbind in der Verbindungszeichenfolge wie empfohlen here, da ich auch TransactionScope mit Timeout verwenden. Das Problem besteht darin, dass die Verbindungen nach der Entsorgung nicht geschlossen werden und schließlich keine Verbindungen mehr im Verbindungspool verfügbar sind. Ich habe das gleiche Ergebnis, wenn ich die TransactionTimeoutIssueDemo geändert (siehe Link) und lief TransactionScopeTest() (mit der ausdrücklichen unbind Connection String) oft genug in einer Schleife alle verfügbaren Verbindungen im Verbindungspool aufbrauchen. Der Standardwert für Verbindungen im Pool ist 100, dies kann jedoch geändert werden, indem beispielsweise die Einstellung verwendet wird. Es scheint, dass die Verbindungen nicht freigegeben werden, wenn die explizite Aufhebung der Bindung verwendet wird, obwohl sowohl SqlConnection als auch TransactionScope mit der Klausel using verwendet werden. Wer weiß, wie man damit umgeht?Verbindungen werden nicht geschlossen, wenn Transaction Binding = Explicit Unbind verwendet wird; In Verbindungszeichenfolge

Antwort

3

Die Verbindungen scheinen nur im Pool zu bleiben und werden nicht wiederverwendet, falls Sie wie im Beispiel eine Ausnahme erhalten. Wenn Sie das Zeitlimit erhöhen, wird die Verbindung wiederverwendet.

Eine Abhilfe für dieses Problem ist die Verbindung Pool im Fall löschen Sie eine Ausnahme wie diese:

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; 
    } 
} 

In den meisten Fällen wird die Transaktion innerhalb der Timeout abgeschlossen wird und alles wird schön und gut sein. Wenn die Transaktion Timeout tatsächlich tun löschen Sie den Pool, um die schmutzigen Verbindungen zu bereinigen, die nicht wiederverwendet bekommen. Dies wirkt sich natürlich auf andere Verbindungen im Pool aus, die nicht von diesem Problem betroffen sind.

Dies ist ein hässlicher Workaround, aber es scheint zu funktionieren.

0

Für was es wert ist, wurde dieses Problem in .NET 4.0 behoben.

Verwandte Themen