Определить проблему исчерпанного пула соединений в .NET можно по появлению ошибки, например: «Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool» («Истёк тайм-аут. Период ожидания получения свободного соединения из пула»). 25 Это может указывать на то, что все подключения в пуле в данный момент заняты и достигнут максимальный размер пула. 2
Для диагностики проблемы также можно использовать следующие методы:
- Запустить spwho или spwho2. 1 Эти системные хранимые процедуры возвращают информацию из системной таблицы sysprocesses, которая показывает статус и сведения обо всех рабочих процессах. 1 Обычно на каждое соединение приходится один идентификатор процесса сервера (SPID). 1
- Использовать SQL Server Profiler. 1 Для трассировки открытых соединений нужно использовать шаблон SQLProfiler TSQL_Replay. 1
- Мониторить счётчики производительности в коде. 1 Для этого можно использовать рутины для извлечения счётчиков или элементы управления .NET PerformanceCounter. 1
Чтобы решить проблему, можно попробовать следующее:
- Не держать соединения долго, по возможности создавать отдельное на каждую операцию. 2
- Если используются фоновые задачи для доступа к БД, проверить, что не создаётся слишком много их. 2 Например, если в цикле запрашиваются данные из БД, нужно убедиться, что прошлый запрос успел отработать к тому моменту, когда делается следующий. 2
- Если делается много фоновых запросов к БД, организовать очереди запросов и обрабатывать их фиксированным числом обработчиков. 2 Или использовать библиотеку TPL Dataflow, которая умеет ограничивать степень параллельности. 2
- Если ничего не помогает, можно увеличить максимальное число соединений в пуле. 2 Для этого нужно настроить параметр maximumpoolsize в строке соединения. 2
Более подробно параметры строки соединения можно посмотреть в документации на используемый драйвер или на сайте connectionstrings.com. 2