2008-11-24 9 views
5

Estoy usando Transaction Binding=Explicit Unbind en la cadena de conexión como se recomienda here ya que también estoy usando TransactionScope con tiempo de espera. El problema es que las conexiones no parecen cerrarse después de ser desechadas y, finalmente, no hay más conexiones disponibles en el conjunto de conexiones. Obtuve el mismo resultado cuando modifiqué TransactionTimeoutIssueDemo (consulte el enlace) y ejecuté TransactionScopeTest() (con la cadena de conexión de desvinculación explícita) suficientes veces en un bucle para agotar 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 usa la desvinculación explícita, aunque tanto SqlConnection como TransactionScope se usan con la cláusula using. ¿Alguien sabe cómo manejar esto?Las conexiones no se cerrarán cuando se usa Enlace de transacción = Desvincular explícitamente; en la cadena de conexión

Respuesta

3

Las conexiones solo parecen permanecer en la agrupación 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 limpiar la piscina de la conexión en caso de que se una excepción de esta manera:

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 complete dentro del tiempo de espera y todo estará bien y dandy. Cuando la transacción realmente hace expira, borra el grupo para limpiar las conexiones sucias que no se volverán a utilizar. Esto, por supuesto, afectará otras conexiones en el conjunto que no se ve afectada por este problema.

Esta es una solución fea pero parece funcionar.

0

Por lo que vale, este problema se corrigió en .NET 4.0.

Cuestiones relacionadas