2009-07-20 4 views
14

SQL 2000 데이터베이스 백엔드가있는 서버에서 실행되는 많은 ASP.Net 웹 사이트 (.Net v3.5)가 있습니다. 몇 달 동안, 나는 "내부 연결 치명적인 오류"라는 메시지와 함께 무작위로 InvalidOperationExceptions를 보였습니다. 그 중간에는 며칠이 걸리고 다른 날에는 하루에 여러 번 오류가있는 경우가 있습니다."내부 연결 치명적인 오류"가 발생하는 이유

비즈니스 및 데이터 액세스 어셈블리를 공유하지만 예외적으로 특히 하나의 사이트에만 국한되지 않습니다. 이 오류는 SqlClient.TdsParser.Run()에서 항상 throw 된 것으로 보입니다. 그것은 구식 SqlCommand.Execute() 호출에서 때때로 던져지며 Linq2Sql 코드에서 던져지는 경우도 있습니다.

네트워크 사용자가 오류나 패킷이 손실되었다는 것을 확신했습니다. 다른 사람이 이것을 경험 했습니까? 운전자 문제 일 수 있습니까? 우리는 아직이 예외에 대한 특정 트리거를 찾아 낼 수 없었습니다. 우리는 윈도우 서버에 II6을 실행하는

2003

답변

21

이 문제를 무시하고 몇 달이 지난 후에 트래픽이 점차 증가함에 따라 임계 수치에 도달하기 시작했습니다. 일부 크롤러를 포함하여 많은 부하가 걸릴 경우 상황이 고조되어 이러한 오류가 논스톱에 쏟아졌습니다.

시행 착오를 거쳐 결국 SqlConnection이 사용 후 즉시 닫히지 않은 소수의 SqlCommand 또는 LINQ 쿼리를 추적했습니다. 대신, LINQ 연결에 대한 오해에서 기인 한 일부 엉성한 프로그래밍을 통해 DataContext 개체가 즉시 처리되지 않고 요청이 끝난 후에 만 ​​폐기되고 연결이 닫힙니다.

C# "using"블록 (다음 요청을 위해 해당 풀을 비울 때)과의 연결을 즉시 닫도록 이러한 메소드를 리팩토링 한 후에는 더 이상 오류가 발생하지 않았습니다. 연결 풀이 너무 복잡해지는 근본적인 이유를 여전히 알 수는 없지만이 유형의 모든 오류를 중지 할 수있었습니다. 이 문제는 내가 게시 한 또 다른 유사한 오류와 함께 해결되었습니다. 여기에 발견 된 내용은 Why is my SqlCommand returning a string when it should be an int?

입니다.
1

는 서버의 로그 폴더를 체크라는 이름의 파일을 (\ 프로그램 파일은 마이크로 소프트 SQL 서버 \ MSSQL.1 \ MSSQL \ LOG 또는 유사한 \) SqlDump * .mdmp 및 SqlDump * .txt. 당신이 찾아내는 경우에 당신은 그것을 제품 지원에 가지고 가야 할 것이다.

1

데이터베이스 연결과 같은 소리가 들리거나 시간이 초과되었습니다.

최근 SQL 2000에 연결하는 IIS 5에서 IIS 6으로 이동하는 것과 비슷한 문제가있었습니다. 문제는 사용 가능한 임시 포트 수가 늘어남에 따라 해결되었습니다.

IIS 서버에 의해 임시 포트의 사용법을보십시오. 기본 최대 개수 의 포트 수는 일반적으로 4000입니다. 서버의 사이트가 특히 사용 중이거나 응용 프로그램이 많은 데이터베이스 호출을하는 경우이 값을 늘릴 것을 고려할 수 있습니다.

최대 허용치를 초과하는지 먼저 모니터링 할 수 있습니다.

"MaxUserPort"및 "TcpTimedWaitDelay"에 대한 Microsoft 기술 자료를 검색하고 필요한 레지스트리를 변경하십시오. 변경하기 전에 레지스트리 또는 스냅 샷 서버를 백업해야합니다. 변경 사항을 적용하려면 재부팅해야합니다.

데이터베이스를 확인하고 사용 후에는 레코드 세트 연결을 닫아야합니다. 닫히지 않으면이 포트 범위가 불필요하게 소모됩니다.

스토어드 프로 시저의 효율성을 확인하십시오. 어쨌든 필요할 때보 다 오래 걸릴 수도 있습니다.

"4 분 안에 4000 개의 소켓을 빠르게 열고 닫으면 클라이언트 익명 포트의 기본 최대 설정에 도달하게되고 기존의 TIME_WAIT 소켓 세트가 시간 초과 될 때까지 새로운 소켓 연결 시도가 실패합니다." - http://support.microsoft.com/kb/328476

관련 문제