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