Соединения не будут закрываться при использовании Transaction Binding = Explicit Unbind; в строке подключения - PullRequest
5 голосов
/ 24 ноября 2008

Я использую Transaction Binding=Explicit Unbind в строке подключения, как рекомендовано здесь , так как я также использую TransactionScope с тайм-аутом. Проблема заключается в том, что соединения не закрываются после удаления, и в итоге в пуле соединений больше нет доступных соединений. Я получил тот же результат, когда я изменил TransactionTimeoutIssueDemo (см. Ссылку) и запустил TransactionScopeTest () (с явной строкой разъединения соединения) достаточно раз в цикле, чтобы использовать все доступные соединения в пуле соединений. Значение по умолчанию для соединений в пуле - 100, но это можно изменить, например, с помощью параметра Max Pool Size =10. Кажется, что соединения не будут освобождены при использовании явной отмены привязки, даже если и SqlConnection, и TransactionScope используются с предложением using. Кто-нибудь знает, как справиться с этим?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2008

Соединения, похоже, остаются в пуле и не используются повторно в случае, если вы получите исключение, как в примере. Если вы увеличите время ожидания, соединение будет использовано повторно.

Временное решение этой проблемы - очистить пул соединений на случай, если вы получите исключение, подобное этому:

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

В большинстве случаев транзакция будет завершена в течение тайм-аута, и все будет хорошо. Когда транзакция на самом деле делает тайм-аут, вы очищаете пул, чтобы очистить грязные соединения, которые не будут повторно использоваться. Это, конечно, повлияет на другие соединения в пуле, на которые эта проблема не влияет.

Это уродливый обходной путь, но, похоже, он работает.

0 голосов
/ 20 августа 2010

Как бы то ни было, эта проблема была исправлена ​​в .Net 4.0.

...