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

Предположим, у меня есть страница ASP.NET. В обработчике загрузки страницы я открываю соединение с базой данных и выполняю некоторую обработку. Но после завершения обработки я не закрываю соединение явно, вызывая метод CLOSE объекта соединения.

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

Ответы [ 5 ]

7 голосов
/ 09 февраля 2010

В документации MSDN об этом достаточно ясно сказано:

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

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

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

3 голосов
/ 09 февраля 2010

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

3 голосов
/ 09 февраля 2010

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

2 голосов
/ 09 февраля 2010

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

2 голосов
/ 09 февраля 2010

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

using (var conn = new SqlConnection(connectionString))
{
    using (var cmd = new SqlCommand(commandText, conn))
    {
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read()) { /* ... */ }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...