2010-02-27 5 views
1

원래 연결 유출이라고 생각했지만 실망스러운 문제가 발생했습니다. 이 응용 프로그램의 데이터 액세스는 Microsoft의 Enterprise Libraries (v4)를 사용하고 있습니다. 모든 데이터 액세스 호출은 같은 ASP.NET SqlConnection 시간 초과 문제

using (DbCommand dbCommand = db.GetStoredProcCommand("sproc")) 
{ 
    db.AddInParameter(dbCommand, "MaxReturn", DbType.Int32, MaxReturn); 
    ...more code 
} 

지금이 응용 프로그램의 인덱스는 모든로드 데이터베이스에 8 호출을 내가 인덱스를 약 15 배를 새로 고쳐 무릎에 응용 프로그램을 가져올 수

로 사용하여 문에 싸여있다. 그것은 때 데이터베이스가 113 연결에 도달하면이 오류가 나타납니다 것 같습니다. 다음은 이상하게 만드는 이유입니다.

트래픽이 많은 사이트에서 entlib과 유사한 코드를 실행했지만이 문제가 절대로 없었습니다.

나는 데이터베이스에 대한 모든 연결을 죽이고 다시 생산 응용 프로그램을 얻을 내가 응용 프로그램을 새로 고칠 때마다 실행중인 경우, 나는이 SQL

SELECT DB_NAME(dbid) as 'Database Name', 
COUNT(dbid) as 'Total Connections' 
FROM sys.sysprocesses WITH (nolock) 
WHERE dbid > 0 
GROUP BY dbid 
를 실행할 수 있습니다 내가 연결의 수를 적극적으로 각각 증가 볼 수 있습니다

페이지를 새로 고칩니다. 동일한 연결 문자열을 사용하여 로컬 상자에서 동일한 코드를 실행해도이 문제가 발생하지 않습니다. 또한 프로덕션 웹 사이트가 다운 된 경우 Visual Studio를 통해 사이트를 실행하고 정상적으로 실행할 수 있습니다. 둘 사이의 유일한 차이점은 프로덕션 사이트에 Windows 인증이 설정되어 있고 로컬 복사본이없는 것입니다. Windows 인증을 해제하면 서버에 아무런 영향을주지 않는 것 같습니다.

이 문제의 원인이나 연결이 SQL Server에서 처리되지 않는 이유에 대해서는 전혀 알지 못합니다. EntLib 객체는 exploseily 객체를 닫을 수 없도록 아무 것도 .Close() 메소드를 전개하지 않습니다.

의견이 있으십니까? 감사합니다.

편집 와우 난 그냥 실제로 오류 메시지가 게시되지 않을 것으로 나타났습니다. 오우. 실제 연결 오류 : 제한 시간이 만료되었습니다. 풀에서 연결을 가져 오기 전에 시간 초과 기간이 경과했습니다. 이는 풀링 된 모든 연결이 사용 중이며 최대 풀 크기에 도달했기 때문에 발생했을 수 있습니다.

+0

"더 많은 코드"를 제공하십시오. –

+1

인덱스가 저장된 procs/SELECT 등을 8 번 호출하면이 쿼리 각각에 의해 데이터베이스에 얼마나 많은 시간이 소요됩니까? 페이지가 DB에서 데이터를 가져 오는 데 꽤 시간이 걸릴 수도 있고 동일한 페이지가 요청 된 경우 새로운 연결 (또는 풀에서)이 발생하고 장기 실행 쿼리를 실행하는 경우 일 수 있습니까? – shahkalpesh

+0

더 많은 코드는 스칼라를 사용하거나 exectues 내부에서 독자를 실행하기 때문에 실제로는 관련이 없습니다. 정말로 바닐라 물건. – dparsons

답변

0

실행중인 저장 프로 시저가 행 또는 테이블 잠금으로 실행되고 있지 않은지 확인하십시오. 또한 가능한 경우 다른 서버에 배포하고 응용 프로그램이 다시 크롤링되는지 확인하십시오.

SQL 서버에 허용되는 최대 연결 수를 늘리십시오.

0

를 해결하려면 다음 링크를 참조 할 수있다?

프로덕션 서버에서 데이터베이스에 어떻게 연결합니까?
주목할 가치가있는 영역 일 수 있습니다.

0

답변을 모르겠지만 프로덕션 환경에서 실행될 때 애플리케이션에 의해 연결이 닫히지 않는 것이 좋습니다. (명확한 의미)

웹 서버와 SQL Server 사이의 네트워크 구성을 검사 할 수 있습니다. 지연 시간이 긴 네트워크로 인해 연결이 끊어지지 않을 수 있습니다. 다른 아무것도 할 수없는 경우, 내가 생산 및 디버그에 디버거 및 엔터프라이즈 라이브러리 소스 코드를 얻을 것 http://msdn.microsoft.com/en-us/library/8xx3tyca%28VS.71%29.aspx

마지막 :

또한

은 다음 MSDN 문서의 끝 부분에 나와있는 성능 카운터를보고 도움이 될 수 있습니다 연결이 닫히지 않는 이유를 알아 내기 위해 엔터프라이즈 라이브러리 내부의 코드.

바보 같은 질문에 DataReader를 제대로 닫고 있습니까? 그렇지 않으면 문제가 될 수 있으며 dev와 prod 간의 동작 차이는 다른 가비지 수집 패턴으로 인해 발생할 수 있습니다.

0

연결 풀링을 사용하지 않도록 설정하고이를 억제하려고했습니다 (ㅎ). 그냥 연결 문자열에 "; Pooling = false"를 추가하십시오. 또한

System.Web.UI.Page page = HttpContext.Current.Handler as System.Web.UI.Page; 
if (page != null) { 
      page.Unload += (EventHandler)delegate(object s, EventArgs e) { 
         try { 
           dbCommand.Connection.Close(); 
         } catch (Exception) { 
         } finally { 
           result = null; 
         } 
      }; 
} 

: 바로 '사용'절에 - 아마 당신은 (페이지가 언로드 할 때 열려있는 연결을 종료하는) 페이지에 다음과 같은 '정리'과 같은 코드를 추가 할 수

또는, SQL 서버와 IIS가 동일한 머신 (실제 성능 향상 기)에 있으면 '공유 메모리'프로토콜을 활성화했는지 확인하십시오!