Le connessioni non si chiuderanno quando si utilizza Transaction Binding = Explicit Unbind; nella stringa di connessione

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

Domanda

Sto usando Binding transazione = esplicito Unbind nella stringa di connessione come raccomandato qui poiché sto anche utilizzando TransactionScope con timeout. Il problema è che le connessioni non sembrano chiudersi dopo essere state eliminate e alla fine non ci sono più connessioni disponibili nel pool di connessioni. Ho ottenuto lo stesso risultato quando ho modificato TransactionTimeoutIssueDemo (vedi il link) ed ho eseguito TransactionScopeTest () (con la stringa di connessione unbind esplicita) abbastanza volte in un ciclo per utilizzare tutte le connessioni disponibili nel pool di connessioni. Il valore predefinito per le connessioni nel pool è 100 ma questo può essere modificato usando ad esempio l'impostazione Dimensione massima pool = 10 . Sembra che le connessioni non verranno rilasciate quando si utilizza il unbind esplicito anche se sia SqlConnection che TransactionScope vengono utilizzati con la clausola using . Qualcuno sa come gestirlo?

È stato utile?

Soluzione

Le connessioni sembrano rimanere solo nel pool e non essere riutilizzate in caso di eccezione, proprio come nell'esempio. Se si aumenta il timeout, la connessione verrà riutilizzata.

Una soluzione alternativa a questo problema consiste nel cancellare il pool di connessioni nel caso in cui si riceva un'eccezione come questa:

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

Nella maggior parte dei casi la transazione verrà completata entro il timeout e tutto andrà bene e dandy. Quando la transazione effettivamente scade il pool, si puliscono le connessioni sporche che non verranno riutilizzate. Questo ovviamente influenzerà altre connessioni nel pool che non sono interessate da questo problema.

Questa è una brutta soluzione ma sembra funzionare.

Altri suggerimenti

Per quello che vale, questo problema è stato risolto in .Net 4.0.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top