SQL Server 2008 시간 초과가 만료되었습니다.

SQL Server 2008 시간 초과가 만료되었습니다.

나는 아무 대답도 없이 Stackoverflow에 아래 질문을 했는데, 어떤 사람이 serverfault에도 질문을 하자고 제안했습니다. 누군가가 도울 수 있기를 바랍니다.

저는 최근 ASP.Net MVC 3 웹 애플리케이션(Data Persistence용 Entity Framework 4.1)을 라이브 서버에 게시했습니다. 응용 프로그램은 하나의 웹 서버에 있고 데이터베이스(SQL Server 2008)는 다른 별도의 서버에 있습니다.

사이트는 조회수가 거의 없는 며칠 동안만 운영되었으며 이로 인해 데이터베이스 테이블에 포함된 레코드가 거의 없습니다(최대 10~20개).

또한 ELMAH(ASP.NET용 오류 로깅 모듈 및 처리기)가 사이트에 통합되어 있으며 이미 다음 오류가 몇 번 발생했습니다.

System.Data.SqlClient.SqlException: 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다.

아래는 ELMAH에서 제공한 전체 세부 정보를 보여줍니다.

System.Data.EntityException: 기본 공급자가 Open에서 실패했습니다. ---> System.Data.SqlClient.SqlException: 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다. System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 예외, 부울 breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 오류) at System.Data .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable) at System.Data. SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, BooleanignoreSniOpenTimeout, Int64timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean IntegratedSecurity) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, BooleanignoreSniOpenTimeout, Timeout타이머 시간 초과, SqlConnection owningObject), System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, ServerInfo PrimaryServerInfo, String failoverHost, String newPassword, Boolean RedirectedUserInstance, SqlConnection owningObject, SqlConnectionString ConnectionOptions, TimeoutTimer timeout), System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist( SQLConnection owningObject, TimeoutTimer 시간 초과, SqlConnectionString 연결 옵션, 문자열 newPassword, 부울 리디렉션UserInstance)(System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity ID, SqlConnectionString 연결 옵션, 개체 공급자 정보, 문자열 newPassword, SqlConnection owningObject, 부울 리디렉션UserInstance))(System.Data.SqlClient) .SqlConnectionFactory.CreateConnection(DbConnectionOptions 옵션, 개체 poolGroupProviderInfo, DbConnectionPool 풀, DbConnection owningConnection) - System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool 풀, DbConnectionOptions 옵션) - System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) ) System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase. System.Data.EntityClient.EntityConnection의 System.Data.SqlClient.SqlConnection.Open()에서 DbConnectionClosed.OpenConnection(DbConnection 외부 연결, DbConnectionFactory 연결Factory).OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String 예외Code, String receivedOperation, Boolean& closeStoreConnectionOnFailure) --- 내부 예외 스택 추적 끝 --- System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection System.Data.EntityClient.EntityConnection.Open()의 System.Data.Objects.ObjectContext.EnsureConnection()의 System.Data.Objects.ObjectQuery에서 원본 연결, 문자열 예외 코드, 문자열 시도 작업, 부울 및 closeStoreConnectionOnFailure)1.GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable 1 소스) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext, IDictionary 2 매개변수) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15. System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 필터, ActionExecutingContext preContext, Func 1 필터, ActionDescriptor actionDescriptor, IDictionary`2 매개변수)의 b__12(), System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext ControllerContext, String actionName)1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList

이 오류가 발생한 경우는 SELECT 쿼리로 인해 발생했습니다. 이러한 선택 쿼리는 매우 간단합니다.

col1 = 1인 테이블에서 col1, col2, col3을 선택합니다.

그리고 앞서 말했듯이 데이터베이스에는 데이터가 거의 없으므로 쿼리가 100개의 레코드를 가져오는 것처럼 보이지 않습니다.

나는 두 가지를 모두 사용하여 이에 대해 몇 가지 연구를 수행했습니다.인터넷그리고스택 오버플로. 어떤 사람들은 양을 늘리라고 제안합니다.dbContext 명령 시간 초과그런데 부동산, 왜 이런 일을 해야 하는지 이해가 안 돼요. 예, 만약 제가 수많은 기록을 되돌린다면, 하지만 제가 말했듯이 이것들은 간단합니다선택하다최대 1~5개의 레코드를 가져오는 명령문입니다.

그리고 개발자는 Entity Framework에서 생성된 SQL을 주의 깊게 관찰해야 한다는 것을 알기 때문에 이 평가판을 다운로드하여 실행했습니다.http://www.datawizard.com문제를 일으키는 Entity Framework SELECT 쿼리에 대해 생성되는 SQL을 살펴보기 위해. 다시 말하지만, 프로파일러는 이러한 쿼리가 매우 간단한 구문임을 보여 주므로 이것이 문제라고 생각하지 않습니다.

어쩌면 내 데이터베이스와 웹 응용 프로그램이 별도의 서버에 있는 것과 관련이 있을 수도 있다고 생각하기 시작했지만 아이디어가 없습니다!

누구든지 이 문제에 대해 도움을 주거나 조언을 해주시면 정말 감사하겠습니다.

모두 감사합니다.

답변1

클라이언트 또는 네트워크 문제를 제거하려면 클라이언트 통계가 활성화된 관리 스튜디오에서 결과 SQL을 실행하고 쿼리 실행에 필요한 런타임과 노력을 관찰하십시오.

GO를 사용하여 SELECT 쿼리를 따라가면 임의의 횟수만큼 연속해서 실행할 수 있으므로 의미 있는 샘플 세트에 대한 평균을 얻을 수 있습니다.

SELECT col1, col2, col3 FROM table WHERE something
GO 1000

또한 그러한 프레임워크는 실제 SQL의 대부분은 아니더라도 많은 부분을 숨기므로 실제 문제가 아닐 수도 있다는 점을 고려하십시오. 아마도 쿼리를 대규모로 병렬화하려고 시도하거나 관련된 ORM으로 인해 테이블에 하드(독점적 읽기-쓰기) 잠금을 보유할 수도 있습니다.

답변2

제공한 스택 추적에 따르면 이는 명령 시간 초과가 아니라 오히려접속 시간 초과(다음 줄이 있습니다: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...)). 이는 VS 2010의 알려진 버그일 수 있습니다. 미러링을 사용하는 경우 다음을 참조하세요.자세한 내용은 이 블로그 게시물을 참조하세요..

관련 정보