Тайм-ауты ASP.net из-за незакрытых соединений - PullRequest
1 голос
/ 15 июня 2011

Истекло время ожидания.Время ожидания истекло до получения соединения из пула.Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.

Это первый сайт ASP.net, который я разработал давным-давно , он имеетэтот код находится наверху множества страниц (и множеством методов).

cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
cn.Open();

На многих страницах нет:

cn.Close();

Также ни один изстраницы делают using(SqlConnection...), (хотя все устройства чтения данных используют блоки).

Первый вопрос: является ли основной кандидат на ошибку?

Второй вопрос, является ли лучшимспособ решить этот рефакторинг / ручной поиск незакрытых соединений?Я знаю, что это уродливый хак, но время, потраченное на рефакторинг, будет огромным, но можем ли мы установить запланированное задание для перезапуска пула соединений один раз в день в 3 часа ночи или что-то в этом роде?

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Даже я столкнулся с этой ошибкой в ​​приложении, над которым когда-то работал. Проблема, которую я идентифицировал, была той же самой - не использовать операторы и не закрывать вызовы.

Я бы посоветовал вам выполнить поиск SqlConnection по всему проекту, а затем включить SqlConnection, SqlCommand и SqlDataAdapter в операторы using, а также сделать connection.close внутри оператора sqlconnection using. Вместе с этим в файле конфигурации увеличьте время ожидания соединения в строке соединения. Вы также можете использовать свойство CommandTimeout SqlCommand.

1 голос
/ 15 июня 2011

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

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

using(var cn = SomeUtilityClass.GetOpenConnection())
{...}

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

...