2010-06-29 5 views
7

SqlConnection.Open()에서 시간 초과가 발생하는 경우는 어떻게됩니까? AppProcess는 다음과 같은 예외를 재활용 한 10 초 후에 우리의 IIS 상자 중 하나에SqlConnection.Open()에서 시간 초과가 발생할 수있는 이유는 무엇입니까?

등장 :

Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
    Message : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    Source : .Net SqlClient Data Provider 
    Help link : 
    Errors : System.Data.SqlClient.SqlErrorCollection 
    Class : 11 
    LineNumber : 0 
    Number : -2 
    Procedure : 
    Server : XXX 
    State : 0 
    ErrorCode : -2146232060 
    Data : System.Collections.ListDictionaryInternal 
    TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean) 
    Stack Trace : at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
     at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
     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, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject) 
     at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) 
     at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, String primaryHost, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) 
     at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 
     at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 
     at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 
     at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 
     at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 
     at 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.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
     at System.Data.SqlClient.SqlConnection.Open() 
     at NHibernate.Connection.DriverConnectionProvider.GetConnection() 
     at NHibernate.Impl.SessionFactoryImpl.OpenConnection() 

속성은 SQL 엔진 오류를 포함 MSDN수에 따라. 그러나 master.dbo.sysmessages에서 -2 오류를 찾을 수 없었습니다. 연결을 여는 동안 작동 간격은 약 3.5 초입니다. 연결 시간 초과가 명시 적으로 변경되지 않았습니다.

2 초 후 유사한 스레드에서 같은 예외가 있지만 다른 위치에서 나타납니다. 호출 스택이 훨씬 짧았습니다.

Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Source : .Net SqlClient Data Provider 
Help link : 
Errors : System.Data.SqlClient.SqlErrorCollection 
Class : 11 
LineNumber : 0 
Number : -2 
Procedure : 
Server : XXX 
State : 0 
ErrorCode : -2146232060 
Data : System.Collections.ListDictionaryInternal 
TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean) 
Stack Trace : at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at NHibernate.Connection.DriverConnectionProvider.GetConnection() 
    at NHibernate.Impl.SessionFactoryImpl.OpenConnection() 

DB와 통신을 시도하는 동안 오류가 발생하는 간격은 초보다 짧습니다.

질문 : 1. 어떻게 이러한 오류를 재현 할 수 있습니까? 2. 왜 두 번째 경우에 호출 스택이 더 짧습니까?

답변

2

미러링으로 인해 문제가 발생했습니다. 동일한 상황이 설명됩니다. here

0

SQL 서버가 작업을 처리 할 수없는 것과 같은 몇 가지 이유가있을 수 있습니다. 일반적으로 SQL Server를 호스팅하는 서버 인 Ram-CPU 프로세스가 올라가고 sql cant가 호출에 응답합니다. 시간 초과 기간을 늘리고 더 기다려주십시오 (확실한 경우 연결 설정이 모두 정확함).

+0

Serkan - 메서드 호출과 오류 사이의 간격이 일반적인 연결 시간 초과 (15 초)보다 짧습니다. 다른 경우에는 거의 즉시 발생했습니다. –

+0

그럼 연결 문제가없는 것 같습니다. 나는 질문이있다. 귀하의 SQL은 로컬 또는 서버에서 실행 중입니까? 서버에서 실행 중이면 서버의 이벤트 로그를 확인하십시오. 네트워크 또는 SQL에 대한 로그가 있습니까? –

+0

SQL 서버는 원격이지만 우리는 SQL 서버에 액세스 할 수 없습니다. 나는 DBA에게 요청을했다. 무엇이 문제를 일으키는 지 궁금합니다. –

1

SqlConnection.Open()의 일부 시간 초과는 연결 유출을 나타냅니다. 연결 풀이 연결이 끊어 질 때 발생할 수 있습니다. 먼저 IIS 시스템의 회수 된 연결 카운터 수를 확인해야합니다. 그것은 0이어야합니다. 그렇지 않으면 SQL 연결이 제대로 닫혀 있는지 코드를 확인해야합니다.

+0

hakan,이 경우에는 텍스트가 거의 동일하지만 다른 예외 유형이 있습니다. System.InvalidOperationException : 제한 시간이 만료되었습니다. 풀에서 연결을 가져 오기 전에 시간 초과 기간이 경과했습니다. 이는 풀링 된 모든 연결이 사용 중이며 최대 풀 크기에 도달했기 때문에 발생했을 수 있습니다. –

관련 문제