8

MS SQL Server 2005 데이터베이스를 많이 호출하는 C#으로 코딩 된 웹 서비스가 있습니다. 코드는 C#의 연결 풀링과 결합 된 블록 사용을 사용합니다.C# 연결 풀링에 너무 많은 sp_resetconnections이 필요한 이유는 무엇입니까?

SQL 추적 중에 "sp_resetconnection"을 여러 번 호출했습니다. 이것들의 대부분은 짧은 < 0.5 초입니다. 그러나 때로는 9 초만큼 지속되는 전화를받는 경우도 있습니다.

sp_resetconnection은 연결 풀링과 관련이 있으며 기본적으로 열린 연결 상태를 다시 설정합니다. 내 질문 :

  • 왜 오픈 연결이 상태를 재설정해야합니까?
  • 왜 이렇게 많은 전화가 왔습니까?
  • sp_reset 연결을 호출하면 부작용이 발생할 수 있습니다.

이것은 매우 신비한 일로, 모든 도움에 감사드립니다.

+0

sp_reset_connetion이 오래 걸리는 프로파일 러 추적이있는 경우 호출 전에 클라이언트가 수행 한 작업을 살펴보십시오. 그러면 통화 중에 어떤 상태가 붕괴되는지 알 수 있습니다. – ahains

+0

[sp \ _reset \ _connection은 무엇입니까?] 가능한 복제본 (http://stackoverflow.com/questions/596365/what-does-sp-reset-connection-do) –

답변

12

리셋을하면 단순히 에 다시 연결할 필요가 없도록 재설정되므로을 재설정하면 재설정 할 수 있습니다. SET 또는 USE 연산과 같은 연결의 정리를 지워서 각 쿼리에 깨끗한 슬레이트가 생깁니다.

연결이 계속 재사용되고 있습니다.여기 extensive list이다 :

sp_reset_connection는 연결의 다음 측면 리셋 : 그것은 (@@ 오류 같은) 모든 에러 상태 및 수를 리셋

  • 그것은 모두 EC의 (실행 상황)을 정지 그런 병렬 쿼리를 실행하는 부모 EC의 자식 스레드입니다.
  • 미해결 된 미해결 I/O 작업을 기다립니다.
  • 서버의 모든 버퍼를 해제합니다. b Y 연결
  • 그것은 연결에 사용되는 모든 버퍼 자원 잠금을 해제합니다
  • 이 연결 소유 할당 된 모든 메모리를 해제합니다 그것은 연결에 의해 생성 된 모든 작업 또는 임시 테이블을 삭제합니다
  • 그것은 모든 시스템 타를 닫습니다 그것은
  • 그것은 열려있는 모든 SQL-XML 관련 작업 테이블을 삭제합니다 열려있는 열려있는 모든 SQL-XML 핸들을 닫습니다 연결
  • 가 소유 한 모든 글로벌 커서를 죽일 것이다 bles 그것은 모든 사용자 테이블을 닫습니다
  • 그것은
  • 가 열려 거래를 중단됩니다 모든 임시 물건을 떨어 뜨리 것
  • 그것은 사용자의 참조 횟수를 감소시킵니다 입대 할 때이 분산 트랜잭션 (transaction)에서 결함 것 현재 데이터베이스; 데이터베이스 그것은
  • 그것은 출시, 그것은 기본값으로 모든 SET 옵션을 재설정합니다
  • 을 수집 할 수있는 핸들이
  • 그것은 @@ 행 개수 값 재설정됩니다 획득 한 잠금 장치를 사용할 수있게됩니다
  • 을 잠글 공유 눌렀다하는
  • 그것은 사용하는 세션 레벨 추적 옵션을 재설정합니다 DBCC TRACEON()를 @@ ID 값
  • 재설정됩니다

sp_reset_connection가 재설정되지 않습니다이다

  • 보안 컨텍스트를 왜 응용 프로그램 역할이
  • 을 되돌릴 수 없기 때문에 당신이 sp_setapprole를 사용하여 응용 프로그램 역할을 입력하면 정확한 연결 문자열
  • 에 따라 연결 풀링 일치 연결
  • 트랜잭션 격리 수준 (!)
1

여기 말한다 What does sp_reset_connection do?에 대한 설명은 "부분적으로, ODBC, OLE-DB와 같은 데이터 액세스 API의 층의과 (내부) 일을 호출하는 SqlClient 연결 풀에서 연결을 다시 사용할 경우 ored 프로 시저 sp_reset_connection. 연결을 다시 사용하기 전에 연결 상태를 재설정하기 위해이 작업을 수행합니다. "그런 다음 sproc이 수행하는 시스템에 대한 세부 정보를 제공합니다.

1

sp_resetconnection은 풀에서 새 연결을 요청할 때마다 호출됩니다. 풀이 사용자를 보증 할 수 없기 때문에 (프로그래머가 아마도 :) 이 올바른 상태로 연결을 유지했기 때문에이 작업을 수행해야합니다. 예 : 커밋되지 않은 트랜잭션이있는 이전 연결을 반환하는 것은 괜찮을 것입니다.

통화의 nr은 새로운 연결을 가져 오는 nr과 관련되어야합니다.

평상시와는 다른 일정의 전화는 확실하지 않습니다. 서버가 그 시간에 다른 물건을 처리하는 데 매우 바쁠 수 있습니다. 네트워크 지연 일 수 있습니다.

1

기본적으로 호출은 상태 정보를 지우는 것입니다. 열려있는 DataReader가있는 경우에는 더 오래 걸릴 것입니다. 이것은 DataReaders가 단일 행만 보유하고 있지만 더 많은 행을 가져올 수 있기 때문입니다. 리셋을 진행하기 전에 각각을 지워야합니다. 따라서 using() 문에서 모든 것을 가지고 있는지 확인하고 일부 문에서 내용을 열어 두지는 마십시오.

이 문제가 발생하면 몇 개의 연결이 실행되고 있습니까?

최대 5 개가 모두 5 개를 누르면 재설정을 호출하면 차단되며 시간이 오래 걸리는 것으로 보입니다. 실제로는 풀링 된 연결이 사용 가능하게 될 때까지 대기하는 것만 차단됩니다.

또한 SQL Express에서 실행중인 경우 매우 쉽게 스레딩 요구 사항으로 인해 차단 될 수 있습니다 (전체 SQL Server에서도 발생할 수 있지만 훨씬 적습니다).

연결 풀링을 해제하면 어떻게됩니까?

관련 문제