ADO.NET поддерживает отдельные группы пулов соединений для каждой строки подключения. Поэтому, если у вас несколько баз данных, они должны иметь свои собственные пулы, и эти пулы не должны мешать друг другу.
Возможно ли, что некоторые запросы занимают много времени? Если одновременно с одной базой данных выполняется достаточно запросов, и они задерживаются, возможно, пул соединений действительно достигается просто из-за открытых подключений.
Чтобы убедиться, что это не так, вы можете проверить, что работает в базе данных, выполнив sp_who
или запустив SQL Server Activity Monitor.
Вы также можете запросить DMVs в базе данных, чтобы увидеть, сколько соединений различных программ, открытых по базе данных:
select
NULL as [Connections by Database],
[host_name] as [Client Machine],
DB.name as [Database],
[program_name] as [Client Program],
COUNT(*) as [Open Connections]
from sys.dm_exec_sessions s (nolock)
left join sys.dm_exec_requests r (nolock)
on r.session_id = s.session_id
left join sys.databases DB (nolock)
on DB.database_id = r.database_id
where s.session_id >= 50 -- Ignore SQL Server processes
group by [host_name], DB.name, [program_name]
order by [Client Machine], [Database], [Client Program]
Если ты узнать, что вам просто нужно больше соединений, вы можете настроить предел в строку подключения, установив свойство Max Pool Size на что-то отличное от 100. Здесь an example.
В рамках отладочной кучи можно просканировать объекты .NET, если вы хотите увидеть, какой пул вызывает проблему. Вам нужно будет захватить дамп памяти процесса w3wp.exe и проанализировать его с помощью инструмента WinDbg (или, возможно, Debug Diagnostics Tool). Я сделал это в прошлом. Это не всегда легко, но это может многое помочь.
EDIT
Существует perfmon counter for ADO.NET connection pooling, который можно использовать для контроля течи соединений. В Performance Monitor, cxpand .NET Data Provider для SqlServer и добавьте счетчик NumberOfReclaimedConnections. Согласно документации, это счетчик означает:
Количество соединений, которые были утилизированы в мусоре коллекцию, где Закрыть или Dispose не вызываются приложением. Непосредственное закрытие или удаление соединений ухудшает производительность.
Мы использовали этот счетчик для проверки того, что наше приложение является утечкой соединений.
hmmmm ... спасибо !!«Итак, если у вас несколько баз данных, у них должны быть свои собственные пулы, и эти пулы не должны мешать друг другу». был точно ват я искал fo! :-) – AndreMiranda
Незнакомым является то, что 10 пользователей используют приложение ... – AndreMiranda
Похоже, пришло время проверить, нет ли утечки, выполнив некоторые из этих тестов. По крайней мере, я бы рекомендовал проверить базу данных, когда это сообщение произойдет, и посмотреть, действительно ли так много открытых подключений. –