Вот предположение, основанное на ограниченной информации.
Я не думаю, что вы правильно избавляетесь от своих соединений с базой данных. Убедитесь, что у вас есть соединения, заключенные в использование предложений. Вызов .Close () недостаточно хорош. Это закрывает соединение, но не избавляется от него.
Во-вторых, причина, по которой сейчас, а не несколько месяцев назад, вероятно, связана с сочетанием объема трафика, который вы сейчас видите, с предыдущим и количеством соединений с базой данных, которые вы сейчас создаете, и прежних.
Меня только что вызвали, чтобы помочь с приложением, которое демонстрировало точно такое же поведение. Все было хорошо, пока однажды он не начал падать. Много. У них были объекты команды sql, обернутые в использование предложений, но не соединение. По мере увеличения трафика пул соединений заполнялся и разрывался. После того, как мы обернули соединения в операторы использования (заставив вызов dispose ()), все прошло гладко.
UPDATE
Я просто хотел уточнить одну вещь. SqlConnection - это оболочка для неуправляемого ресурса; Именно поэтому он реализует IDisposable. Когда ваш объект подключения выходит из области видимости, он становится доступным для сбора мусора. С точки зрения кодирования, вы действительно не представляете, когда это может произойти. Это может быть несколько секунд, это может быть значительно дольше.
Однако пул соединений, с которым общается SqlConnection, является совершенно отдельным объектом. Он не знает, что соединение больше не будет использоваться. Метод Dispose () в основном сообщает пулу соединений, что этот конкретный фрагмент кода выполняется с соединением. Это означает, что пул соединений может немедленно перераспределить эти ресурсы. Обратите внимание, что в некоторых документациях MS говорится, что Close () эквивалентна Dispose (), но мои тесты показали, что это просто неправда.
Если ваш сайт создает больше соединений, чем он явно удаляет, то пул соединений потенциально может заполниться в зависимости от того, когда происходит сборка мусора. Это действительно зависит от количества созданных соединений и количества полученного трафика. Более высокий трафик = больше соединений и более длительные промежутки времени между запусками GC.
Теперь конфигурация IIS по умолчанию дает вам 100 исполняющихся потоков на рабочий процесс. И конфигурация пула приложений по умолчанию составляет 100 подключений. Если вы избавляетесь от своих подключений сразу после их использования, вы никогда не превысите размер пула. Даже если вы делаете много db-вызовов, поток запросов выполняет их по одному.
Однако, если вы добавите больше рабочих процессов, увеличите число потоков на процесс или не сможете избавиться от ваших соединений, то вы столкнетесь с реальной возможностью превышения размера пула соединений. Обратите внимание, что вы можете контролировать размер пула в строке подключения sql .
Не беспокойтесь о производительности вызова dispose и повторного открытия соединения несколько раз при обработке одной страницы. Пул существует для поддержания соединений с сервером, чтобы сделать этот процесс очень быстрым.