Las conexiones no se cerrarán cuando se use Vinculación de transacción = desvinculación explícita; en cadena de conexión

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

Pregunta

Estoy usando Transaction Binding = Despliegue explícito en la cadena de conexión como se recomienda aquí ya que también estoy usando TransactionScope con tiempo de espera. El problema es que las conexiones no parecen cerrarse después de eliminarse y, finalmente, no hay más conexiones disponibles en el grupo de conexiones. Obtuve el mismo resultado cuando modifiqué TransactionTimeoutIssueDemo (vea el enlace) y ejecuté TransactionScopeTest () (con la cadena de conexión de desvinculación explícita) suficientes veces en un bucle para usar todas las conexiones disponibles en el grupo de conexiones. El valor predeterminado para las conexiones en el grupo es 100, pero esto se puede cambiar utilizando la configuración Max Pool Size = 10 por ejemplo. Parece que las conexiones no se liberarán cuando se use la desvinculación explícita, aunque tanto SqlConnection como TransactionScope se usen con la cláusula using . ¿Alguien sabe cómo manejar esto?

¿Fue útil?

Solución

Las conexiones solo parecen permanecer en el grupo y no se reutilizan en caso de que obtenga una excepción, como en el ejemplo. Si aumenta el tiempo de espera, la conexión se reutilizará.

Una solución a este problema es borrar el grupo de conexiones en caso de que obtenga una excepción como esta:

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

En la mayoría de los casos, la transacción se completará dentro del tiempo de espera y todo estará bien. Cuando el tiempo de espera de la transacción realmente se hace , se borra el grupo para limpiar las conexiones sucias que no se reutilizarán. Por supuesto, esto afectará a otras conexiones en el grupo que no se ve afectado por este problema.

Esta es una solución fea pero parece funcionar.

Otros consejos

Por lo que vale, este problema se solucionó en .Net 4.0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top