최대 연결 풀 수는 100으로 제한


27

Windows Server 2008 상자에서 SQL Server 2008 R2 SP1을 실행하고 있습니다. Visual Studio 2010에서 다음을 수행하는 .NET 스크립트가 있습니다.

  • 데이터베이스에 도달
  • 변경합니다
  • 반복

반복되는 총 횟수는 150이지만 100 연결에서 멈추고 이유를 알 수 없습니다. 하나의 스레드 만 사용하도록 스크립트를 조정할 수 있지만 최대 연결 설정이 누락 된 위치를 알고 싶습니다. 나중에 참조하기에 더 유용합니다.

지금까지 내가 확인한 곳은 다음과 같습니다.

  • Visual Studio 2010의 SQL 연결 문자열 (1000으로 설정)
  • SSMS 데이터베이스 인스턴스 연결 속성 (0 [무한] 사용자 연결로 설정 됨)
  • Server 2008에 대한 일부 정보는 100 개가 넘는 연결을 처리 할 수있는 것으로 보입니다.
  • SP_WHO2논리 연결에 대한 자세한 정보를 제공하는 코드와 함께 단계별 연결 수는 52에서 시작하고 152 개의 논리적 연결에서 "최대 풀링 된 연결 수 도달"오류와 함께 스크립트 오류가 발생 함을 확인했습니다.
  • 사용할 연결 문자열을 변경했습니다 Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

다른 곳을 확인 해야할지 모르겠습니다. 여기에 움직이는 부분이 많이 있다는 것을 알고 있지만 어딘가에 최대 수영장 설정이 누락되었다는 느낌이 들었습니다.


1
연결 문자열을 게시 할 수 있습니까? 내 대답을 참조하십시오. 이것이 해결 방법이어야합니다 (이 값은 연결 문자열에 지정됩니다. System.Data.SqlClient기본값은 100으로 설정되어 있으므로 연결 풀이 소진됩니다).
Thomas Stringer

답변:


24

SQL Server는 기본적으로 최대 32767 개의 연결 을 허용합니다 . 을 사용하여 변경할 수 있습니다 sp_configure. 이 설정에 대한 현재 구성을 보려면 다음 쿼리를 사용하십시오.

select * from sys.configurations
where name ='user connections'

기본적 value_in_use으로 0과 같은 최대 32767이 표시 됩니다 (기본 설정 사용). 이것이 변경된 경우 링크에 설명 된대로 다른 값을 사용하도록 SQL Server를 재구성 할 수 있습니다.

또한 응용 프로그램 외부에서 더 많은 활동이 있거나 응용 프로그램이 생각보다 더 많은 연결을 만들고 있기 때문에 실제로 얼마나 많은 연결이 이루어지고 있는지 검토해야합니다 . perfmon 에서 일반 통계-> 논리 연결을 보거나 다음 값을 쿼리하십시오 sys.dm_os_performance_counters(cntr_value는 현재 시점 값을 표시합니다).

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

그렇습니다, 나는 이미 사용자 연결을 확인했습니다. (가장 갔으며 UI와 Microsoft 설명서에서 가장 쉽게 찾을 수 있습니다. 또한 코드를 단계별로 살펴보고 SSMS를 통한 논리적 연결 수를 살펴 보았습니다. . 논리적 연결에 대해 공회전을 정보의 상당한 금액을 제공 SP_WHO2를 사용하여 내 서버 (51 개) 연결이 스크립트가 실패하면 빌드 100 개 연결이 내가 지금있는 곳으로 왔 그의 방법...
숀 롱

내가 취한 단계로 내 질문을 좀 더 명확히했습니다. SQL의 설정이 아닐 수도 있으므로 Windows 및 Visual Studio 설정을 살펴보기 시작했습니다.
Sean Long

1
모든 것을 확인했지만 여전히 100 연결에서 실패하면 대답은 데이터베이스 설정 외부에 있습니다. 참고로,이 51 개의 연결은 모든 시스템 프로세스 (+1)입니다.
Mike Fal

마지막으로 언급 한 내용이 일부만 마무리 된 것입니다. 100 개의 연결이 생성되는 이유를 자세히 살펴보고 코드에서 누수가 발견되었습니다. 고정 후 잘 작동합니다. 위의 정보는 여전히 유용하지만 다른 사람들도 유용하게 사용할 수 있기를 바랍니다.
Sean Long

25

연결 문자열에서을 지정하십시오 max pool size=<your desired max pool size>. 즉, 최대 풀 크기를 500으로 변경하려면 연결 문자열이 다음과 유사 할 수 있습니다.

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

분명히 나는 ​​당신의 다른 매개 변수를 너무 많이 가정하고 있지만, 이것은 당신에게 진행하는 방법에 대한 좋은 아이디어를 줄 것입니다. 연결 풀링은 클라이언트 측 공급자 적용입니다. 연결 문자열을 통해이 최대 풀 크기 설정을 지정해야하는 클라이언트입니다.

또한 연결을 올바르게 닫거나 폐기해야합니다. 그렇지 않으면 연결이 연결됩니다. 다음과 같은 것 (C #) :

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

using(C #에서) 블록은 호출 IDisposable.Dispose()완료시. 또한 구현할 수 SqlConnection.Dispose()또는 SqlConnection.Close()에서 finally(A)의 블록 try/catch/finally블록.

참조 : SqlConnection.ConnectionString 속성에 대한 MSDN 설명서


다음은 연결 문자열이며 내 질문도 업데이트합니다. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long

3
연결 문자열이 어디에나 있습니까? 내가 묻는 이유는 다른 연결 문자열이 다른 연결 풀이되기 때문입니다.
토마스 스트링거

아주 좋은 질문입니다. 지금까지 3 개의 연결 문자열을 확인했지만 모두 높은 최대 풀을 추진하고 있습니다. 다른 문자열을 찾을 수 있는지 살펴 보겠습니다.
Sean Long

실행을 디버그 SqlConnection.ConnectionString하면 특정 작업에 대한 런타임 값이 무엇인지 확인할 수 있습니다. 가장 쉬운 방법입니다. 없으면 max pool size100입니다.
Thomas Stringer

1
실제로 OP에 올바르게 응답하므로 승인 된 답변으로 표시해야합니다. 그는 클라이언트 연결 문자열 최대 풀 크기 매개 변수와 연결을 닫거나 제거해야 할 필요성을 언급했습니다.
Adam Caviness
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.