Что происходит с незамкнутым подключением к базе данных?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Ранее сегодня я обнаружил ошибку в одном из наших проектов - существует связь с базой данных, которая никогда не закрывается, я имею в виду, что метод Close () никогда не вызывается. Однако когда я закрываю приложение, соединение закрывается (много раз проверялось в sql management studio). Почему?

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

Решение

Соединение закроется, когда приложение закроется. Ознакомьтесь с финализацией SqlConnection . Из документации MSDN для Object.Finalize :

" Во время закрытия домена приложения Finalize автоматически вызывается для объектов, которые не освобождаются от завершения, даже тех, которые все еще доступны. "

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

Еще одна вещь, о которой следует помнить, это то, что в .Net вы можете заключить ваши соединения в блок использования, и это закроет и удалит ваши соединения для вас. Так что отсутствие явного Close () не так уж и плохо, если у вас есть блоки использования ...

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

это функциональный эквивалент блока try / finally с conn.close в finally. Многие разработчики пропускают использование блоков - убедитесь, что вы не делаете то же самое в этом случае.

Если вы переписываете свой код, чтобы закрыть ваши соединения, рекомендуется использовать Использование блоков вокруг всех объектов вашей базы данных (соединение, команда, читатель), чтобы убедиться, что они закрываются и удаляются, когда они выходят за пределы области действия. блок использования. Я определенно рекомендую записывать их в ваш код, а не просто conn.Close (), где это необходимо.

SQL-соединения дороги в создании, и ADO.NET использует технику, называемую пул соединений, которая позволяет использовать их повторно.

Цитата из MSDN :

  

Настоятельно рекомендуется, чтобы вы   всегда закрывайте соединение, когда вы   закончили использовать его, чтобы он   быть возвращены в пул соединений и   быть повторно использованы.      

Если максимальный размер пула был   достигнуто и нет полезного соединения   доступно, запрос в очереди.   Пулер затем пытается восстановить любой   соединения до истечения времени ожидания   достигнут (по умолчанию 15 секунд).   Если пулер не может удовлетворить   запрос до времени соединения   исключение.

Когда вы выйдете из приложения обычным способом, я ожидаю запуска финализаторов. Они закроют соединение, если оно все еще открыто. Только не зависите от этого: может пройти некоторое время, прежде чем эти финализаторы будут запущены при нормальной работе вашего приложения, поэтому вы будете держать слишком много открытых соединений.

В случае сбоя приложения, возможно, финализатор не запустится, и соединение останется открытым по истечении срока службы приложения.

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