Les connexions ne se fermeront pas si vous utilisez Transaction Binding = Explicit Unbind; dans la chaîne de connexion

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

Question

I & # 180; m utilisant Transaction Binding = Unbind explicite dans la chaîne de connexion recommandée ici car j'utilise également TransactionScope avec timeout. Le problème est que les connexions ne semblent pas se fermer après avoir été éliminées et qu'il n'y a plus de connexions disponibles dans le pool de connexions. J'ai eu le même résultat lorsque j'ai modifié le TransactionTimeoutIssueDemo (voir le lien) et que j'ai exécuté TransactionScopeTest () (avec la chaîne de connexion explicitement non liée) suffisamment de fois dans une boucle pour utiliser toutes les connexions disponibles dans le pool de connexions. La valeur par défaut pour les connexions du pool est 100, mais vous pouvez modifier ce paramètre en utilisant le paramètre Taille du pool maximum = 10 , par exemple. Il semble que les connexions ne seront pas libérées lors de l’utilisation explicite de la suppression de la liaison, même si SqlConnection et TransactionScope sont utilisés avec la clause utilisant . Quelqu'un sait comment gérer cela?

Était-ce utile?

La solution

Les connexions ne semblent rester que dans la piscine et ne sont pas réutilisées au cas où vous auriez une exception, comme dans l'exemple. Si vous augmentez le délai, la connexion sera réutilisée.

Une solution à ce problème consiste à vider le pool de connexions au cas où vous auriez une exception comme celle-ci:

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

Dans la plupart des cas, la transaction sera achevée dans le délai imparti et tout ira bien. Lorsque la transaction est effectivement terminée, vous effacez le pool afin de nettoyer les connexions non conformes qui ne seront pas réutilisées. Ceci affectera bien sûr les autres connexions du pool qui ne sont pas affectées par ce problème.

C’est une solution de contournement moche mais qui semble fonctionner.

Autres conseils

Pour ce que ça vaut, ce problème a été corrigé dans .Net 4.0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top