Verbindungen werden nicht schließen, wenn mit der Transaktion Binding = Explicit Unbind; in Verbindungszeichenfolge

StackOverflow https://stackoverflow.com/questions/314459

Frage

Ich bin mit Transaction Binding=Explicit Unbind in der Verbindungszeichenfolge wie empfohlen hier da bin ich auch mit Transaction Timeout verwenden. Das Problem ist, dass die Verbindungen nicht nach angeordnet ist, zu schließen scheinen und schließlich gibt es keine mehr möglichen Verbindungen im Verbindungspool. 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, aber dies kann unter Verwendung der Einstellung Max Pool Size =10 zum Beispiel geändert werden. Es scheint, dass die Verbindungen nicht freigegeben werden, wenn explizite unbind Verwendung obwohl sowohl die SqlConnection und die Transaction mit der using Klausel verwendet werden. Wer weiß, wie dies zu umgehen?

War es hilfreich?

Lösung

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

für dieses Problem Eine Abhilfe ist, den Verbindungspool zu löschen, falls 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 abzuschließen innerhalb der Timeout und alles wird schön und gut sein. Wenn die Transaktion tatsächlich tut Timeout Sie den Pool, um zu löschen, die schmutzigen Verbindungen zu bereinigen, die nicht wiederverwendet werden lassen. Dies wird natürlich Auswirkungen auf andere Verbindungen im Pool, die nicht von diesem Problem betroffen ist.

Dies ist eine hässliche Abhilfe, aber es scheint zu funktionieren.

Andere Tipps

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top