Предположим, что у меня есть страница ASP.NET. В обработчике событий загрузки страницы я открываю соединение с базой данных и делаю некоторую обработку. Но после того, как обработка сделана, я не закрываю соединение явно путем вызова БЛИЗКОГО метода объекта соединения.
Теперь, когда обработка страницы в стороне сервера закончена, GC расположит все переменные на моей странице, и также, объект соединения также. Но то, когда это расположено, делает соединение, которое было открыто, ранее автоматически закрывается? Я имею в виду, когда GC располагает объект соединения, делает это, автоматически закрывают соединение, которое было установлено с сервером базы данных; или это просто располагает объект соединения, и соединением в базе данных остаются открытым, пока тайм-аут соединения не происходит в базе данных, и затем сервер базы данных закрывает соединение отдельно?
В документации MSDN это довольно ясно:
Если SqlConnection выходит за пределы области , оно не будет закрыто. Следовательно, вы должны явно закрыть соединение , вызвав Close или Dispose. Close и Dispose функционально эквивалентны.
Либо используйте с использованием блоков
для автоматического удаления, либо явно .Close ()
it. , использующие блоки
, являются предпочтительными.
Если оставить соединения открытыми, у вашего приложения могут закончиться соединения при попытке выполнения новых запросов, что приведет к ошибкам. Я столкнулся с такой проблемой в отлаживаемом приложении. Первоначальным разработчикам не удалось явно закрыть соединения на нескольких страницах, и трафик был достаточно высоким, чтобы пользователи начали получать ошибки. Я заключил проблемные соединения в блок , используя
, и проблема исчезла.
Соединение осталось открытым. Если у вас много просмотров страниц и много открытых подключений, вы можете получить ошибку 500.
Вы должны использовать с блоками
, тогда вам не придется задавать вопрос:
using (var conn = new SqlConnection(connectionString))
{
using (var cmd = new SqlCommand(commandText, conn))
{
using (var reader = cmd.ExecuteReader())
{
while (reader.Read()) { /* ... */ }
}
}
}
Ваши соединения не будут закрыты до после (не когда) ваш объект страницы будет завершен, и это может занять некоторое время. Было бы очень легко увеличить количество доступных подключений и начать получать ошибки.
ваше соединение не будет закрыто, если оно не будет выбрано GC, и если у вас много посетителей, приводящих к большому количеству подключений, это может быть ужасно. Кроме того, если вы попытаетесь открыть открытое соединение, оно выдаст ошибку, поэтому вам нужно проверить это, лучше либо записать его в блоке using, либо закрыть соединение самостоятельно.