2012-02-03 2 views
1

Можно создать дубликат:
Entity framework 4 not closing connection in sql server 2005 profilerПочему мой оператор использования не закрывает соединение?

Ну, много разработчиков на StackOverflow говорят, что я не должен беспокоиться, чтобы закрыть мое подключение: мой используя оператор закрывает соединение для меня, here и here и по всему сайту. К сожалению, я этого не вижу. Вот мой код:

[Test, Explicit] 
    public void ReconnectTest() 
    { 
     const string connString = "Initial Catalog=MyDb;Data Source=MyServer;Integrated Security=SSPI;Application Name=ReconnectTest;"; 
     for (int i = 0; i < 2000; i++) 
     { 
      try 
      { 
       using (var conn = new SqlConnection(connString)) 
       { 
        conn.Open(); 
        using (var command = conn.CreateCommand()) 
        { 
         command.CommandText = "SELECT 1 as a"; 
         command.CommandType = CommandType.Text; 
         command.ExecuteNonQuery(); 
        } 
        //conn.Close(); 
// optional breakpoint 1 below 
        } 
       } 
       catch(SqlException e) 
       { 
// breakpoint 2 below 
        Console.WriteLine(e); 
       } 
// breakpoint 3 below 
      } 
     } 

Когда я включаю все контрольные точки и начать свой тест, то первая итерация успешно, и я ударил точку останова 3. На этом этапе соединение остается открытым: Я вижу его в Profiler, и sp_who2 выводит его тоже.

Предположим, что в это время я выхожу на обед, и моя связь простаивает. Таким образом, наш производственный сервер убивает его. Чтобы подражать этому, я убиваю соединение с SSMS.

Итак, когда я ударил F5 и запустил вторую итерацию, мое соединение убито. К сожалению, он не открывается автоматически, поэтому ExecuteNonQuery выдает следующее исключение: «произошла ошибка транспортного уровня». Когда я запускаю третью итерацию, мое соединение действительно открывается: я рассматриваю это как событие в Profiler, и sp_who2 выводит его также.

Даже когда у меня была раскованная моя команда conn.Close(), соединение все еще не закрывается, и когда я убью его из SSMS, следующая итерация все еще взрывается.

Что мне не хватает? Почему нельзя использовать оператор close my connection? Почему нельзя открыть() на самом деле открыть его в первый раз, но в следующий раз удастся?

Этот вопрос возник из my previous one

+1

[Пул соединений] (http://msdn.microsoft.com/en-us/library/8xx3tyca (v = vs.80) .aspx) – Blorgbeard

+0

Это предполагаемое поведение. Читайте о [повторное использование соединения/объединение] (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) –

ответ

1

Когда вы звоните SqlConnection.Dispose(), что вы делаете из-за using блока, соединение не будет закрыто, за се. Это , выпущенный обратно в пул соединений.

Во избежание постоянного соединения/разрыва соединения пул соединений будет поддерживать соединения open для вашего применения. Таким образом, имеет смысл, что соединение будет оставаться открытым.

Что происходит после этого, я не могу объяснить из рук в руки - я знаю, что сохранение случайного подключения было бы не, потому что ваше приложение, безусловно, может сделать более одного одновременного соединения.

+1

Да, это объясняет это. Спасибо! –

Смежные вопросы