none
System.Data.SqlClient.SqlE xception (0x80131904): el tiempo de espera expiró RRS feed

  • Pregunta

  • Tengo una pagina web a través de la cual los clientes acceden a distintos datos sobre su hogar. Hasta hace unos días, los usuarios finales no podían volver a iniciar sesión. Los usuarios que iniciaron sesión no parecen haber cerrado sesión, no hay un cierre automático de las sesiones inactivas, sin embargo, los usuarios que se desconectaron no se pudo volver a iniciar sesión. Parece que alcanzamos un límite máximo de conexión en algún lugar y ningún otro usuario puede volver a iniciar sesión, aparece el siguiente mensaje de error. 

    [Win32Exception (0x80004005): The wait operation timed out]

    [SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
       System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +3189408
       System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +753
       System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +5042
       System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +87
       System.Data.SqlClient.SqlDataReader.get_MetaData() +101
       System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption) +590
       System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) +3136
       System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) +691
       System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +123
       System.Data.SqlClient.SqlCommand.ExecuteScalar() +359
       Slbf.OAuth.Token.CreateToken(String ClientId, String UserId, String UserData) +524
       SoftGuard.OAuth.OAuthLoginHandler.ProcessRequest(HttpContext context) +1192
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +798
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +91


    Esto no es un problema de red, porque traté de iniciar sesión en el host local y en la misma red, todavía tengo el mismo problema. Al usar una credencial falsa, regresa con un mensaje de contraseña incorrecta casi de inmediato. Al usar un nombre de usuario / contraseña correctos, gira durante aproximadamente 30 segundos antes de darnos el "System.Data.SqlClient".Excepción (0x80131904): error de tiempo de espera caducado. 

    ¿En qué parte de la base de datos SQL verificaría el problema subyacente? Extrañamente, el reinicio del servidor (tanto la aplicación como los servidores de la base de datos) no parecía haber ayudado. 

    miércoles, 25 de octubre de 2017 0:01

Respuestas

  • Cuando te da un error de timeout al abrir una conexión después de un rato de haber estado funcionando bien, la causa más probable es que hayas agotado el Pool de conexiones. Y este agotamiento se produce cuando existe un error en alguna de las páginas que hace que una conexión se abra y no se le haga el Close. Al principio, funciona bien, es decir, cada vez que pasa por ahí y tiene que abrir la conexión, se asigna una nueva conexión desde el Pool y funciona. Pero cuando se alcanza el tamaño máximo del Pool (algo más de 100 conexiones, pero se puede configurar en la cadena de conexión), entonces al pedirle que abra la conexión se queda parado esperando a que se cierre alguna de las que ya estaban abiertas. Pero como nunca se cierran, porque fueron abiertas desde la parte de código que tiene el error y olvida cerrarlas, pues al cabo de un tiempo (algo así como 20 segundos por defecto) da un error de TimeOut indicando que no pudo abrir la conexión.

    Estos errores son sumamente molestos de depurar, porque el sitio donde se produce el error de timeout normalmente no es el sitio donde está el error (las conexiones sin cerrar se pueden estar perdiendo desde otra página distinta). Para evitar que se produzcan estos errores, se deben programar todos los accesos a base de datos usando la construcción "using" (en lugar de Open y Close por separado). El "using" garantiza que siempre se cierra la conexión.

    miércoles, 25 de octubre de 2017 6:45