As conexões não serão fechadas ao usar Transaction Binding=Explicit Unbind;na cadeia de conexão
-
10-07-2019 - |
Pergunta
Estou a usar Transaction Binding=Explicit Unbind
na string de conexão conforme recomendado aqui já que também estou usando TransactionScope com timeout.O problema é que as conexões parecem não fechar após serem descartadas e, eventualmente, não há mais conexões disponíveis no pool de conexões.Obtive o mesmo resultado quando modifiquei TransactionTimeoutIssueDemo (veja o link) e executei TransactionScopeTest() (com a string de conexão de desvinculação explícita) vezes suficientes em um loop para usar todas as conexões disponíveis no pool de conexões.O valor padrão para conexões no pool é 100, mas isso pode ser alterado usando a configuração Max Pool Size =10
por exemplo.Parece que as conexões não serão liberadas ao usar o unbind explícito, mesmo que tanto o SqlConnection quanto o TransactionScope sejam usados com o using
cláusula.Alguém sabe como lidar com isso?
Solução
As conexões parecem apenas permanecer no pool e não serem reutilizadas caso você obtenha uma exceção, como no exemplo.Se você aumentar o tempo limite, a conexão será reutilizada.
Uma solução alternativa para esse problema é limpar o pool de conexões caso você receba uma exceção 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;
}
}
Na maioria dos casos, a transação será concluída dentro do tempo limite e tudo ficará bem.Quando a transação realmente faço tempo limite, você limpa o pool para limpar as conexões sujas que não serão reutilizadas.É claro que isso afetará outras conexões no pool que não são afetadas por esse problema.
Esta é uma solução alternativa feia, mas parece funcionar.
Outras dicas
Pelo que vale, esse problema foi corrigido no .Net 4.0.