Последние несколько дней мы видим это сообщение об ошибке на нашем сайте слишком много:
«Время ожидания истекло. Период ожидания истек до получения соединения из пула. Это могло произойти, потому что все соединения в пуле использовались и был достигнут максимальный размер пула».
Мы ничего не изменили в нашем коде в течение некоторого времени. Я пересмотрел код, чтобы проверить открытые соединения, которые не закрывались, но нашли все в порядке.
Как я могу решить это?
Нужно ли редактировать этот пул?
Как я могу отредактировать максимальное количество соединений в этом пуле?
Каково рекомендуемое значение для сайта с высоким трафиком?
Обновить:
Нужно ли что-то редактировать в IIS?
Обновить:
Я обнаружил, что число активных подключений составляет от 15 до 31, и обнаружил, что максимально допустимое количество подключений, настроенных на сервере SQL, превышает 3200, слишком много - 31, или я должен что-то редактировать в конфигурации ASP.NET. ?
источник
Ответы:
В большинстве случаев проблемы с пулами соединений связаны с «утечками соединений». Ваше приложение, вероятно, не закрывает свои подключения к базе данных правильно и последовательно. Когда вы оставляете соединения открытыми, они остаются заблокированными, пока сборщик мусора .NET не закроет их для вас, вызвав их
Finalize()
метод.Вы хотите убедиться, что вы действительно закрываете соединение . Например, следующий код вызовет утечку соединения, если код между
.Open
иClose
выдает исключение:Правильный путь будет такой:
или
Когда ваша функция возвращает соединение из метода класса, убедитесь, что вы кэшируете его локально и вызываете его
Close
метод. Вы потеряете соединение, используя этот код, например:Соединение, возвращенное с первого звонка,
getConnection()
не закрывается. Вместо того, чтобы закрывать ваше соединение, эта строка создает новое и пытается закрыть его.Если вы используете
SqlDataReader
илиOleDbDataReader
, закройте их. Несмотря на то, что закрытие самого соединения, кажется, делает свое дело, приложите дополнительные усилия для явного закрытия объектов чтения данных при их использовании.В этой статье « Почему переполнение пула соединений? » Из журнала MSDN / SQL объясняется много деталей и предлагаются некоторые стратегии отладки:
sp_who
илиsp_who2
. Эти системные хранимые процедуры возвращают информацию изsysprocesses
системной таблицы, которая показывает состояние и информацию обо всех рабочих процессах. Как правило, вы увидите один идентификатор процесса сервера (SPID) для каждого соединения. Если вы назвали свое соединение, используя аргумент «Имя приложения» в строке соединения, ваши рабочие соединения будет легко найти.TSQL_Replay
шаблоном SQLProfiler для отслеживания открытых соединений. Если вы знакомы с Profiler, этот метод проще, чем опрос с использованием sp_who.источник
После установки .NET Framework v4.6.1 наши подключения к удаленной базе данных сразу же начали истекать из- за этого изменения .
Для исправления просто добавьте параметр
TransparentNetworkIPResolution
в строку подключения и установите для него значение false :источник
Если ваше использование не увеличилось, кажется маловероятным, что есть просто отставание в работе. ИМО, наиболее вероятным вариантом является то, что что-то использует соединения и не освобождает их быстро. Вы уверены, что используете
using
во всех случаях? Или (через какой-либо механизм) освободить соединения?источник
Проверяли ли вы DataReaders, которые не закрыты, и response.redirects перед закрытием соединения или устройства чтения данных. Соединения остаются открытыми, когда вы не закрываете их перед перенаправлением.
источник
Мы также время от времени сталкиваемся с этой проблемой на нашем веб-сайте. В нашем случае виновником является наша статистика / индексы, устаревшие. Это приводит к тому, что ранее быстро выполняющийся запрос (в конце концов) замедляется и время ожидания истекает.
Попробуйте обновить статистику и / или перестроить индексы в таблицах, затронутых запросом, и посмотрите, поможет ли это.
источник
Вы можете указать минимальный и максимальный размер пула, указав
MinPoolSize=xyz
и / илиMaxPoolSize=xyz
в строке подключения. Эта причина проблемы могла быть другой вещью как бы то ни было.источник
Я также столкнулся с этой проблемой, когда использовал какой-то сторонний уровень данных в одном из моих приложений .NET. Проблема заключалась в том, что слой не закрывал соединения должным образом.
Мы сами выбросили слой и создали его, который всегда закрывает и удаляет связи. С тех пор мы больше не получаем ошибку.
источник
Вы также можете попробовать это для решения проблемы тайм-аута:
Если вы не добавили httpRuntime в веб-конфигурацию, добавьте это в
<system.web>
теги
Измените строку подключения следующим образом;
При последнем использовании
источник
В основном это связано с тем, что соединение не было закрыто в приложении. Используйте «MinPoolSize» и «MaxPoolSize» в строке подключения.
источник
В моем случае я не закрывал объект DataReader.
источник
Если вы работаете над сложным унаследованным кодом, где простое использование (..) {..} невозможно - как я и сделал - вы можете проверить фрагмент кода, который я разместил в этом вопросе SO, чтобы определить стек вызовов создания соединения, когда соединение потенциально утечек (не закрывается после установленного времени ожидания). Это позволяет довольно легко определить причину утечки.
источник
Не создавайте SQL-соединение слишком много раз. Откройте одно или два соединения и используйте их для всех последующих операций sql.
Кажется, что даже при
Dispose
подключении возникает исключение.источник
В дополнение к размещенным решениям ....
Имея дело с 1000 страницами устаревшего кода, каждая из которых вызывает общий GetRS несколько раз, вот еще один способ решить эту проблему:
В существующей общей DLL мы добавили опцию CommandBehavior.CloseConnection :
Затем на каждой странице, пока вы закрываете устройство чтения данных, соединение также автоматически закрывается, поэтому утечки соединения предотвращаются.
источник
У меня была та же проблема, и я хотел поделиться тем, что помогло мне найти источник: добавить имя приложения в строку подключения, а затем проконтролировать открытое подключение к SQL Server.
источник
Эта проблема у меня была в моем коде. Я вставлю пример кода, который я перешел ниже ошибки. Период ожидания истек до получения соединения из пула. Это могло произойти из-за того, что все пул соединений использовались и был достигнут максимальный размер пула
Вы хотите закрыть соединение каждый раз. До этого я не использовал тесную связь из-за этого я получил ошибку. После добавления оператора close у меня вышла эта ошибка
источник
Вы пропустили соединения в вашем коде. Вы можете попробовать использовать, чтобы подтвердить, что вы их закрываете.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/
источник
С этой проблемой я сталкивался раньше. В итоге возникла проблема с брандмауэром. Я просто добавил правило в брандмауэр. Мне пришлось открыть порт,
1433
чтобы сервер SQL мог подключиться к серверу.источник
Использовать это:
источник
SqlConnection.ClearPool
, но разве это не позволяет вернуть ваше текущее соединение обратно в пул соединений? Я думал, что идея пула соединений состояла в том, чтобы позволить более быстрые соединения. Надежное освобождение соединения из пула каждый раз, когда оно завершается, означает, что НОВОЕ соединение нужно будет создавать КАЖДЫЙ РАЗ, а не вытаскивать запасное из пула? Пожалуйста, объясните, как и почему эта техника полезна.Да, есть способ изменить конфигурацию. Если вы находитесь на выделенном сервере и вам просто нужно больше соединений SQL, вы можете обновить записи «max pool size» в обеих строках соединения, следуя этим инструкциям:
Найдите строки подключения, они будут похожи на примеры ниже:
"add name =" SiteSqlServer "connectionString =" server = (local); database = dbname; uid = dbuser; pwd = dbpassword; pooling = true; время жизни соединения = 120; максимальный размер пула = 25; ""
5. Измените максимальный размер пула = X на требуемый размер пула.
источник
Убедитесь, что вы установили правильные настройки для пула соединений. Это очень важно, как я объяснил в следующей статье: https://medium.com/@dewanwaqas/configurations-that-significantly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 Вы увидите значительное улучшение производительности вашего приложения, если вы последуете ему.
источник
В моем случае у меня был бесконечный цикл (из свойства get, пытающегося получить значение из базы данных), который продолжал открывать сотни соединений Sql.
Чтобы воспроизвести проблему, попробуйте это:
источник