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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top