2011-07-06 13 views
10

.NET을 사용하여 작성한 코드에 문제가 있습니다.연결 풀에서 연결을 사용하는 방법을 찾는 방법

문제는 내가 잠시 후 나는 다음과 같은 오류가 있음을 의미 일부 사기 데이터베이스 코드가 어딘가에 있다는 것입니다 :

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

어디 선가 내가 중 하나 처리하지 않았기 때문에 그것이 알고 내 datareaders 또는 유사하게 연결을 열어서 풀에 반환되지 않는 것을 의미합니다. 이 문제가 내 코드에서 어디에서 발생하는지 파악하는 데 약간의 문제가 있습니다.

그래서 내 질문 :

는 사용 연결에서 무엇을하고 있는지 알아 연결 풀을 조회 할 수있는 방법이 있습니까. 난 단지 어떤 쿼리가 실행되어 오류 코드 조각을 찾을 수 있는지 찾는 방법을 찾고 있습니다.

그 가치가 무엇인지에 대해서는 해당 데이터베이스에서 활동 모니터를 실행할 수있는 권한이 없습니다.

+0

어떤 프레임 워크 버전을 사용하고 있습니까? –

+0

@Conrad : Version 2.0 – Chris

답변

12

Is there any way to query the connection pool to find out what its in use connections are doing.

아니요. 연결 풀은 응용 프로그램이 유지 관리하는 것입니다 (실제로는 List<DbConnectionInternal>). 리플렉션을 통해 풀의 연결을 얻거나 디버깅 중이면 로컬 또는 감시 윈도우 (아래 참조)를 통해 풀의 연결을 얻을 수 있지만 그 연결에서 무슨 일이 일어나고 있는지 또는 어떤 객체가 Connection.Close (또는 Dispose)를 호출해야하는지 알 수 없습니다. 당신은 당신이 풀링 된 연결이 부족했습니다 때 타임 아웃을 얻을 순간 sp_who를 또는 sp_who2를 실행할 수 있습니다 운이 좋다면 그래서

enter image description here

도움이되지 않을 때하지만 그 가능성의 대부분이 결과는 이렇게 보일 것입니다.

SPID Staus Login Hostname Blkby DBname Command   .... 
---- ------- ----- --------- ----- ------ ---------------- 
79 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
80 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
81 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
82 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 

예, 실제로 응용 프로그램이 많은 연결을 열었으며 응용 프로그램을 닫지 않았고 아무 것도하지 않았습니다.

가장 좋은 방법은 응용 프로그램의 프로필을 작성하고 ADO.NET Performance Counters을 사용하고 NumberOfReclaimedConnections을 자세히 관찰하고 철저한 코드 검토를 수행하는 것입니다.

정말로 필사적 인 경우이 문제가 발생하면 풀을 지울 수 있습니다.

using (SqlConnection cnn = new SqlConnection("YourCnnString")) 
{ 

    try 
    { 
      cnn.Open(); 
    } 
    catch (InvalidOperationException) 
    { 
      SqlConnection.ClearPool(cnn); 
    } 
    cnn.Open(); 

} 

그것은 단지 자원이 부족하기 전에 서버가 허용하는대로 응용 프로그램이 많은 연결을 열 수 있기 때문에 그것은 당신의 DB 서버를 질식의 가능성이 있기 때문에 나는 그러나이에 대해 당신을주의 않습니다.

+0

감사합니다 콘라드. 꽤 포괄적 인 답변을 것 같아 내가 뭘 의심했다. 결국 데이터베이스 접근 방식을 작성하는 방식에 불만이 결정하고 완전히 그것을 철저한 끝났다 그러나 이것은 미래에 유용합니다. 특히 감시 창에서 연결 풀을 찾는 방법에 대한 지침입니다. :) – Chris

2

SSMS를로드하고 질문이있는 데이터베이스에서 sp_who2을 실행 해 보셨습니까?

USE [SomeDatabase] 
EXEC sp_who2 

순간적으로 어떤 일이 일어나는지 보여 주어야합니다.

+0

오타를 수정하려는 경우 sp_who2를 시도했지만 현재 연결 만 반환했습니다.문제의 코드와 동일한 연결 설정을 사용하도록 연결을 변경했지만 여전히 내 현재 연결로 보이는 한 행만 보여주었습니다. 나는 이것이 활동 모니터를 실행하는 것과 동일한 사용 권한 문제라고 생각합니다. :(감사합니다 제안.) – Chris

관련 문제