2010-06-29 22 views
7

¿Cuáles son los casos cuando se produce el tiempo de espera en SqlConnection.Open()?¿Por qué se puede agotar el tiempo de espera en SqlConnection.Open()?

En una de nuestras cajas de IIS 10 segundos después de AppProcess se recicló la siguiente excepción apareció:

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() 

Según MSDNNúmero propiedad contiene un error del motor SQL. Pero no pude encontrar el error -2 en master.dbo.sysmessages. El intervalo entre las operaciones que intentaron abrir la conexión fue de aproximadamente 3,5 segundos. El tiempo de espera de la conexión no se ha cambiado explícitamente.

Después de 2 segundos apareció una excepción similar para el mismo hilo, pero en el lugar diferente. La pila de llamadas fue mucho más corta:

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() 

El intervalo entre la operación que intenta comunicarse con la base de datos y el error es menor que el segundo.

Preguntas: 1. ¿Cómo reproducir tales errores? 2. ¿Por qué la pila de llamadas es más corta en el segundo caso?

Respuesta

2

Parece que el problema fue causado por la duplicación. Se describe la misma situación here

0

Puede haber algunas razones por las cuales su servidor SQL no puede procesar su trabajo. Generalmente el servidor que aloja SQL Server, Ram: el proceso de la CPU aumenta y su sql no puede responder su llamada. aumente la duración del tiempo de espera y espere más (si está seguro, la configuración de su conexión es correcta).

+0

Serkan: el intervalo entre la llamada al método y el error es menor que el tiempo de espera de conexión habitual (15 segundos). En otro caso, sucedió casi de inmediato. –

+0

Parece que no hay un problema de conexión. Tengo una pregunta. Su Sql se está ejecutando en local o en el servidor? Se está ejecutando en el servidor, verifica los registros de eventos del servidor. ¿Hay algún registro sobre Red o Sql? –

+0

El servidor SQL es remoto pero no tenemos acceso a él. Puse una solicitud a DBA. Me pregunto qué puede causar el problema. –

1

Algunos casos de tiempo de espera en SqlConnection.Open() se refieren a una fuga de conexión. Puede ocurrir cuando el grupo de conexiones está sin conexiones. Primero debe verificar el número de contador de conexiones reclamadas de la máquina IIS. Debería ser 0. Si no, debería verificar su código para asegurarse de que las conexiones SQL estén cerradas correctamente.

+0

hakan, en ese caso habría un tipo de excepción diferente, aunque el texto será casi el mismo: System.InvalidOperationException: expiró el tiempo de espera. El tiempo de espera transcurrido antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de la agrupación. –

Cuestiones relacionadas