Что происходит, если я оставляю соединение с базой данных открытым в веб-странице ASP.NET

Предположим, что у меня есть страница ASP.NET. В обработчике событий загрузки страницы я открываю соединение с базой данных и делаю некоторую обработку. Но после того, как обработка сделана, я не закрываю соединение явно путем вызова БЛИЗКОГО метода объекта соединения.

Теперь, когда обработка страницы в стороне сервера закончена, GC расположит все переменные на моей странице, и также, объект соединения также. Но то, когда это расположено, делает соединение, которое было открыто, ранее автоматически закрывается? Я имею в виду, когда GC располагает объект соединения, делает это, автоматически закрывают соединение, которое было установлено с сервером базы данных; или это просто располагает объект соединения, и соединением в базе данных остаются открытым, пока тайм-аут соединения не происходит в базе данных, и затем сервер базы данных закрывает соединение отдельно?

7
задан John Saunders 9 February 2010 в 05:57
поделиться

5 ответов

В документации MSDN это довольно ясно:

Если SqlConnection выходит за пределы области , оно не будет закрыто. Следовательно, вы должны явно закрыть соединение , вызвав Close или Dispose. Close и Dispose функционально эквивалентны.

Либо используйте с использованием блоков для автоматического удаления, либо явно .Close () it. , использующие блоки , являются предпочтительными.

Если оставить соединения открытыми, у вашего приложения могут закончиться соединения при попытке выполнения новых запросов, что приведет к ошибкам. Я столкнулся с такой проблемой в отлаживаемом приложении. Первоначальным разработчикам не удалось явно закрыть соединения на нескольких страницах, и трафик был достаточно высоким, чтобы пользователи начали получать ошибки. Я заключил проблемные соединения в блок , используя , и проблема исчезла.

8
ответ дан 6 December 2019 в 10:49
поделиться

Соединение осталось открытым. Если у вас много просмотров страниц и много открытых подключений, вы можете получить ошибку 500.

3
ответ дан 6 December 2019 в 10:49
поделиться

Вы должны использовать с блоками , тогда вам не придется задавать вопрос:

using (var conn = new SqlConnection(connectionString))
{
    using (var cmd = new SqlCommand(commandText, conn))
    {
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read()) { /* ... */ }
        }
    }
}
2
ответ дан 6 December 2019 в 10:49
поделиться

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

3
ответ дан 6 December 2019 в 10:49
поделиться

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

2
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: