답변:
연결의 최대 수 SQL Server 버전에서와 판은 32,767입니다.
다음을보고 현재 SQL Server 연결 수를 확인할 수 있습니다.
SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END
, CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END;
위 쿼리에서 사용 된 연결과 사용되지 않은 연결 간의 비율이 관련된 경우 서버에 연결된 클라이언트 응용 프로그램에서 연결 풀링을 사용하도록 설정하고 해당 연결을 효율적으로 사용하지 못할 수 있습니다. 개발자가 이러한 응용 프로그램의 연결 문자열을 수정하여 연결 풀의 크기를 제한하고 연결을 올바르게 처리하도록 할 수 있습니다. 연결이 올바르게 삭제되지 않으면 클라이언트 응용 프로그램이 실행되는 동안 연결이 열린 상태로 유지됩니다.
특히 불쾌감을 느끼고 최근에 수행하지 않은 모든 연결을 제거해야하는 경우 (실제로 현재 작업을 수행 중인지 여부에 관계없이 ) 다음 코드를 실행하면 다음과 같은 세션 목록이 생성됩니다. 죽일 수 있습니다. 실제로 명령을 실행하려면 생성 된 명령을 새 SSMS 창에 복사하여 붙여 넣어야합니다. 만일을 대비 하여 이력서를 최신 상태로 유지하는 것이 좋습니다 .
DECLARE @cmd NVARCHAR(MAX); SET @cmd = ''; SELECT @cmd = @cmd + CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';' FROM sys.dm_exec_connections dec WHERE dec.most_recent_sql_handle = 0x0;
PRINT @cmd;
여러 SQL Server 노드에서 데이터를 샤딩하여 연결 수를 32,767 개 이상으로 선형 확장 할 수 있습니다. 그러나 제 생각에는 연결 수를 제한하는 방법으로 샤딩을 사용하는 것은 거미를 죽이기 위해 원자 폭탄을 사용하는 것과 비슷합니다. 그것은 거미 를 죽일 것이지만 하루가 끝날 때 더 큰 문제 가있을 수 있습니다. 말할 것도없이, 원자 폭탄을 만드는 것은 꽤 힘든 일이며, 샤딩을 제대로 구현하는 것은 말할 것도 없습니다.
is_user_process
한정자 를 추가하는 것이 좋으며 , last_request_start_time
최근에 있었던 세션을 배제하는 것은 결코 아프지 않을 것 입니다. 얼마나 최근에요? 또 다른 좋은 질문입니다.
과거에 연결 풀링에서 이상한 동작을 겪어 왔으며 시나리오가 이러한 상황 중 하나와 잘 맞습니다. 응용 프로그램이 연결 풀링을 사용하는 경우 (그리고 여전히 확인하거나 거부 할 때까지 여전히 추측 중입니다) 열려있는 많은 연결이 유지됩니다. 이것은 의도적으로 설계된 동작입니다.
연결 풀링은 데이터베이스 연결 작성의 오버 헤드를 줄이는 것을 목표로합니다. 예를 들어 연결 풀 3을 예로 들어 보겠습니다. 라이프 사이클에 알 수있는 한 콜드 연결 풀 캐시에서 시작하여 다음과 같이 진행됩니다.
sp_reset_connection
스레드 1의 연결 풀 문제이것은 지나치게 단순화되었지만 두드러진 요점은 다음과 같습니다.
sp_reset_connection
.다음은 이러한 결론을 내리기 위해 사용한 참고 자료입니다.