Что происходит с незамкнутым подключением к базе данных? - PullRequest
7 голосов
/ 19 июня 2009

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

Ответы [ 4 ]

4 голосов
/ 19 июня 2009

Соединение закроется при выходе из приложения. Читайте о Завершение SqlConnection . Из документации MSDN для Object.Finalize :

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

2 голосов
/ 19 июня 2009

Еще одна вещь, о которой следует помнить, это то, что в .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 (), где это необходимо.

1 голос
/ 19 июня 2009

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

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

1 голос
/ 19 июня 2009

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

Цитата из MSDN :

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

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

...