Соединения не будут закрываться при использовании привязки транзакции=Явное отвязывание;в строке подключения

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

Вопрос

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

Это было полезно?

Решение

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

Обойти эту проблему можно, очистив пул соединений на случай, если вы получите исключение, подобное следующему:

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top