357 votos

El tiempo de espera expiró. El período de tiempo de espera ha transcurrido antes de que se complete la operación o el servidor no responde. La declaración ha terminado

por favor vea el error de abajo:

Server Error in '/' Application.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +404
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6387741
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +538
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +689
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +327
   NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209
   DataLayer.OnlineUsers.Update_SessionEnd_And_Online(Object Session_End, Boolean Online) +440
   NiceFileExplorer.Global.Application_Start(Object sender, EventArgs e) +163

[HttpException (0x80004005): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +4052053
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +352
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11686928
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4863749

Realmente me confunde este error,
Tengo muchos usuarios en mi sitio web (20000~60000 por día) (un sitio de descarga de archivos para móviles) y tengo acceso remoto a mi servidor (servidor de Windows 2008-R2).
algunas veces tengo server is unavailable error pero no había visto un error de tiempo de espera de la conexión hasta ahora.
¿por qué este error cuenta y cómo puedo arreglarlo?

EDITAR DESPUÉS DE LAS RESPUESTAS:
mi Aplicación_Inicio en Global.asax es como abajo :

protected void Application_Start(object sender, EventArgs e)
{
    Application["OnlineUsers"] = 0;

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

y el procedimiento de almacenamiento:

ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
    @Session_End datetime,
    @Online bit
As
Begin
    Update OnlineUsers
    SET
        [Session_End] = @Session_End,
        [Online] = @Online

End

Tengo dos métodos para conseguir usuarios en línea.
1 - usando la aplicación["Usuarios en línea"] = 0;
2 - el otro usando la base de datos.

así que, para el método #2 debería resetear todos los usuarios en línea en Application_Start.
y hay más de 482.751 registros en esa tabla.

1 votos

Como dice aquí Por defecto son 15 segundos

1 votos

Es mejor hacer un análisis de la causa root, hay varias razones para causar este problema. La más básica es la estructura compleja de la consulta. Me enfrenté al mismo problema cuando recupero imágenes que se almacenan como valores hexadecimales en la tabla.

0 votos

Además de las causas anteriores, añadiré una más: El tiempo de espera de la cerradura: docs.microsoft.com/es-us/sql/t-sql/statements/ Si este hilo espera el bloqueo demasiado tiempo, se agotará el tiempo de espera basado en el documento anterior.

395voto

Marnix van Valen Puntos 6197

Parece que tienes una consulta que está tomando más tiempo del que debería. A partir del rastro de tu pila y tu código deberías ser capaz de determinar exactamente qué consulta es.

Este tipo de tiempo de espera puede tener tres causas;

  1. Hay un punto muerto en algún lugar
  2. Las estadísticas de la base de datos y/o la caché del plan de consulta son incorrectas
  3. La consulta es demasiado compleja y necesita ser afinada

Un punto muerto puede ser difícil de arreglar, pero es fácil determinar si es así. Conéctese a su base de datos con Sql Server Management Studio. En el panel izquierdo, haga clic con el botón derecho del ratón en el nodo del servidor y seleccione Monitor de actividad . Echa un vistazo a los procesos en ejecución. Normalmente la mayoría estarán inactivos o en ejecución. Cuando se produce el problema se puede identificar cualquier proceso bloqueado por el estado del proceso. Si hace clic con el botón derecho del ratón en el proceso y selecciona detalles le mostrará la última consulta ejecutada por el proceso.

La segunda cuestión hará que la base de datos utilice un plan de consulta no óptimo. Puede resolverse aclarando las estadísticas:

exec sp_updatestats

Si eso no funciona, también podrías intentar

dbcc freeproccache

No debe hacer esto cuando su servidor esté bajo una gran carga porque incurrirá temporalmente en un gran golpe de rendimiento ya que todos los procs y consultas almacenadas se recompilan cuando se ejecutan por primera vez. Sin embargo, ya que usted declara que el problema ocurre a veces y el rastro de la pila indica que su aplicación se está iniciando, creo que está ejecutando una consulta que sólo se ejecuta ocasionalmente. Tal vez sea mejor que fuerce a Sql Server a no reutilizar un plan de consulta anterior. Vea esta respuesta para los detalles de cómo hacerlo.

Ya he tocado el tercer tema, pero se puede determinar fácilmente si la consulta necesita ser afinada ejecutando la consulta manualmente, por ejemplo usando Sql Server Management Studio. Si la consulta tarda demasiado en completarse, incluso después de restablecer las estadísticas, es probable que necesites ajustarla. Si necesitas ayuda para ello, deberías publicar la consulta exacta en una nueva pregunta.

43 votos

Estaba teniendo este mismo error pero en una consulta que 'sólo' tardaba 8seg... y tu consejo sobre el exec sp_updatestats solucionó mi problema. Muchas gracias.

2 votos

Resolver un problema como éste casi nunca es cuestión de ajustar los tiempos de espera o el tamaño del pool de conexiones. Tendrás que sumergirte y averiguar la causa root. Si necesitas ayuda para resolver esa causa root puedes publicar tu propia pregunta.

8 votos

Esto no es ciertamente un bloqueo. Puede ser causado por un bloqueo excesivo, pero los bloqueos se resuelven en un segundo, y generan errores diferentes. Esto puede ser un bloqueo excesivo, pero no un bloqueo.

171voto

Elastep Puntos 967

En tu código donde ejecutas el procedimiento almacenado deberías tener algo como esto:

SqlCommand c = new SqlCommand(...)
//...

Añade esa línea de código:

c.CommandTimeout = 0;

Esto esperará tanto tiempo como sea necesario para que la operación se complete.

164 votos

También debe tener en cuenta que el valor 0 no es recomendado : Un valor de 0 no indica ningún límite, y debe evitarse en un CommandTimeout porque un intento de ejecutar un comando esperará indefinidamente. Es mejor conocer el tiempo que tarda el comando, y aumentar el valor de Timeout si es necesario.

9 votos

Estoy de acuerdo con Otiel y he votado a la baja tu respuesta: Al establecer el commandTimeout a 0 no le das al servidor web la oportunidad de recuperarse de un servidor de base de datos que no responde. En segundo lugar, cuando usted golpea el tiempo de espera por defecto debe considerar la búsqueda de la causa. En la mayoría de los casos es mejor arreglar la consulta que aumentar el tiempo de espera.

18 votos

No caería en la trampa de no recomendarlo. Ha sido muy útil para mí y mis tareas diarias programadas: Tener un tiempo de espera infinito no impide que un proceso se complete y devuelva un error si algo va mal. Simplemente, te permite permitir que una consulta termine cuando lo necesite, sin darte problemas más adelante, porque no habías asignado suficiente tiempo para que el proceso terminara. También puedes evitar el bloqueo de tu programa mediante el multihilo.

30voto

Kev Ritchie Puntos 945

Podrías poner el CommandTimeOut propiedad del Comando SQL para permitir la transacción SQL de larga duración o necesita mirar la Consulta SQL que está causando el timeout.

0 votos

Hola, "o tienes que mirar la consulta SQL que está causando el tiempo de espera" -> en Sql Server 2008 ¿dónde debo comprobar ese tiempo de espera?

0 votos

Es posible que tenga que probar el procedimiento almacenado que se llama desde DataLayer.OnlineUsers.Update_SessionEnd_And_Online ya que el seguimiento de la pila parece apuntar hacia él. Tome una copia de la base de datos en vivo en la prueba y ejecute el procedimiento almacenado pasando los parámetros requeridos, si toma más de 30 segundos para completar, es por eso que usted está recibiendo un tiempo de espera. Asumo que tienes acceso a Sql Server Management Studio.

0 votos

Sí, tengo acceso a Sql Server 2008. Debería probar tu manera.

2voto

kolin Puntos 1270

Usé esto:

http://www.simple-talk.com/sql/performance/how-to-identify-slow-running-queries-with-sql-profiler/

para identificar las consultas de funcionamiento lento, y en consecuencia, optimizarlas (más).

2voto

ARS Puntos 1763

@SilverLight.. Esto es claramente un problema con un objeto de la base de datos. Puede ser una consulta mal escrita, o la falta de índices. Pero por ahora no le sugeriré que aumente el tiempo de espera sin investigar el problema con sus objetos de la base de datos.

NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

Ponga un breakpoint en esta línea de código para encontrar el nombre del procedimiento y luego optimice el procedimiento mirando su plan de ejecución.

No puedo ayudarte más hasta que publiques los detalles del procedimiento almacenado.

0 votos

El procedimiento almacenado no hace nada del otro mundo. Sin embargo, parece que la tabla OnlineUsers está bloqueada mientras se ejecuta el procedimiento. Pruebe el perfilador SQL para ver lo que está sucediendo en Application_Start

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X