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