2014-02-20 6 views
2

Добрый вечер!Объединение соединений SQL Server

У меня есть сомнения, связанные с пулом соединений asp.net. Я работаю над приложением, которое иногда генерирует исключение «максимальный размер пула».

Моя команда снова и снова просматривала какой-то код, который протекал, но ничего не найдено.

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

Если SQL Server содержит несколько баз данных для нескольких приложений asp.net разных сторон, могут ли эти другие базы данных вмешиваться в мою базу данных (моя база данных находится в том же SQL-сервере). Например, если есть какое-то соединение с утечкой приложения, может ли это утечка генерирует «максимальный размер пула» в моем приложении?

Спасибо!

ответ

3

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 не вызываются приложением. Непосредственное закрытие или удаление соединений ухудшает производительность.

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

+0

hmmmm ... спасибо !!«Итак, если у вас несколько баз данных, у них должны быть свои собственные пулы, и эти пулы не должны мешать друг другу». был точно ват я искал fo! :-) – AndreMiranda

+0

Незнакомым является то, что 10 пользователей используют приложение ... – AndreMiranda

+0

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

Смежные вопросы