Как найти, что использует подключения в пуле соединений

У меня проблема с кодом, который я написал с помощью .NET.

Проблема в том, что где-то у меня есть какой-то изворотливый код базы данных, что означает, что через некоторое время я получаю следующую ошибку:

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

Я знаю, что это потому, что где-то я не выбрал ни одного из своих datareaders или что-то подобное, что означает, что у него все еще есть соединение, чтобы он не возвращался в пул. У меня проблемы с поиском, когда это происходит в моем коде.

Итак, мой вопрос:

Есть ли способ запросить пул соединений, чтобы узнать, что делает его использование. Я просто ищу способ найти, какой запрос выполняется, чтобы я мог найти оскорбительную часть кода.

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

Ответ 1

Есть ли способ запросить пул соединений, чтобы узнать, что в используемых соединениях.

Нет. На самом деле, нет. Пул соединений - это то, что ваше приложение поддерживает (на самом деле List<DbConnectionInternal>). Если вы действительно хотели, чтобы вы могли подключиться к пулам через отражение или если вы отлаживаете, через локальное окно или окно просмотра (см. Ниже), но вы не можете добраться до того, что происходит на этом соединении, или какой объект должен был вызвать Connection.Close(или Dispose). Так что это не помогает

enter image description here

Если вам повезет, вы можете выполнить sp_who или sp_who2 в тот момент, когда вы получите таймаут, когда у вас закончились объединенные соединения, но, скорее всего, большинство результатов будут выглядеть так.

SPID Staus    Login Hostname  Blkby DBname Command          ....
---- -------  ----- --------- ----- ------ ---------------- 
79   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
80   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
81   sleeping uName WebServer .     YourDb AWAITING COMMAND .....
82   sleeping uName WebServer .     YourDb AWAITING COMMAND .....

Это означает, что да, действительно, ваше приложение открыло много соединений и не закрыло их и даже ничего не делает с ними.

Лучший способ борьбы с этим - профилировать ваше приложение с помощью счетчиков производительности ADO.NET и внимательно следить за NumberOfReclaimedConnections и также тщательно просмотрите обзор кода.

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

using (SqlConnection cnn = new SqlConnection("YourCnnString"))
{

     try
     {
            cnn.Open();
     }
     catch (InvalidOperationException)
     {
             SqlConnection.ClearPool(cnn);
     }
     cnn.Open();

}

Однако я предостерегаю вас от этого, потому что он может удушить ваш сервер БД, потому что он позволяет вашему приложению открывать столько соединений, сколько сервер разрешит, прежде чем он просто исчерпает ресурсы.

Ответ 2

Вы пробовали загружать SSMS и запускать sp_who2 в соответствующей базе данных?

USE [SomeDatabase]
EXEC sp_who2

Это должно показать вам, что происходит в момент времени.