ADO.NET은 연결 문자열마다 별도의 연결 풀 그룹을 유지 관리합니다. 따라서 데이터베이스가 여러 개인 경우 자체 풀이 있어야하며 풀이 서로 간섭하지 않아야합니다.
일부 요청에 시간이 오래 걸릴 수 있습니까? 단일 데이터베이스에 대해 한 번에 충분한 요청이 실행되고 지연되면 연결 풀이 열려있는 연결 때문에 연결 풀에 실제로 도달했을 수도 있습니다.
당신은
sp_who
을 실행하여 또는 SQL Server
Activity Monitor를 실행하여 데이터베이스에서 실행되는 것을 확인할 수 있습니다, 이러한 경우가 확인합니다. 방금 더 많은 연결이 필요하다는 것을 알아 않은 경우
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]
, 당신이 한계를 조정할 수 있습니다
또한 데이터베이스에서 열린 얼마나 많은 연결 다양한 프로그램을 볼 수있는 데이터베이스에 DMV에를 조회 할 수 있습니다 Max Pool Size 속성을 100 이외의 값으로 설정하여 연결 문자열을 지정하십시오. 여기에 an example이 있습니다.
문제의 원인이되는 풀을보고 싶다면 디버깅 힙의 .NET 개체를 조사 할 수 있습니다. w3wp.exe 프로세스의 메모리 덤프를 캡처하여 WinDbg (또는 아마도 Debug Diagnostics Tool)와 같은 도구로 분석해야합니다. 나는 이것을 과거에 해왔다. 반드시 쉬운 것은 아니지만 많은 도움이 될 수 있습니다.
편집
당신이 새는 연결을 모니터링하는 데 사용할 수있는 perfmon counter for ADO.NET connection pooling있다. 성능 모니터에서 cxpand .NET Data Provider for SqlServer를 클릭하고 NumberOfReclaimedConnections 카운터를 추가합니다. 문서에 따르면,이 카운터 의미 :
쓰레기를 닫기 또는 폐기가 응용 프로그램에 의해 호출되지 않은 수집을 재생 한 연결의 수입니다. 명시 적으로 연결을 닫거나 처리하지 않으면 성능이 저하됩니다.
이 카운터는 응용 프로그램의 연결이 누수되는지 확인하기 위해이 카운터를 사용했습니다.
음 ... 감사합니다!"여러 데이터베이스를 보유하고 있다면 자체 수영장이 있어야하며 수영장이 서로 간섭해서는 안됩니다." 내가 찾고 있었던 바로 그 wat이었다! :-) – AndreMiranda
낯선 사람은 10 명의 사용자가 응용 프로그램을 사용한다는 것입니다 ... – AndreMiranda
이러한 테스트 중 일부를 실행하여 누출이 없는지 확인하는 것처럼 들립니다. 적어도이 메시지가 발생할 때 데이터베이스를 확인하고 실제로 많은 연결이 있는지 확인하는 것이 좋습니다. –