valor tiempo services periodo operación operacion net excedió evitar espera ejecución completar caducado aumentar antes agotó agotado c# asp.net timeout connection sql-server-2008-r2

c# - services - Tiempo agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado



tiempo de espera de la operación de espera agotado c# (11)

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

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

Coloque un punto de interrupción en esta línea de código para finalizar el nombre del procedimiento y luego optimice el procedimiento observando su plan de ejecución.

No puedo ayudarlo más hasta el momento en que publique detalles sobre el procedimiento almacenado.

Tengo muchos usuarios en mi sitio web (20000-60000 por día), que es un sitio de descarga para archivos móviles. Tengo acceso remoto a mi servidor (Windows Server 2008-R2).
He recibido errores de "El servidor no está disponible" anteriormente, pero ahora estoy viendo un error de tiempo de espera de conexión.
No estoy familiarizado con esto, ¿por qué ocurre y cómo puedo solucionarlo?

El error completo está abajo:

Error del servidor en la aplicación ''/''. Tiempo agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado. Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Data.SqlClient.SqlException: Tiempo de espera expirado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.

Error de fuente:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de la pila de excepciones a continuación.

Traza de la pila:

[SqlException (0x80131904): El tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Data.SqlClient.SqlConnection.OnError (excepción SqlException, breakConnection booleano) +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, método String, resultado DbAsyncResult) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (resultado DbAsyncResult, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (String StorageProcName, IDataParameter [] parámetros, Int32 y 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): El tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (contexto HttpContext, aplicación HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext context, MethodInfo [] handlers) +191
System.Web.HttpApplication.InitSpecial (estado HttpApplicationState, manejadores MethodInfo [], IntPtr appContext, contexto HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, contexto HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375

[HttpException (0x80004005): El tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Web.HttpRuntime.FirstRequestInit (contexto de HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (JPP) en el que se encuentra el campo de juego de correo electrónico en el que se encuentra el correo electrónico.

EDITAR DESPUÉS DE RESPUESTAS:
Mi Application_Start en Global.asax es como a continuación:

protected void Application_Start(object sender, EventArgs e) { Application["OnlineUsers"] = 0; OnlineUsers.Update_SessionEnd_And_Online( DateTime.Now, false); AddTask("DoStuff", 10); }

El procedimiento almacenado que se llama es:

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 obtener usuarios en línea:

  1. utilizando la Application["OnlineUsers"] = 0;
  2. el otro usando la base de datos

Entonces, para el método # 2, reinicio todos los usuarios en línea en Application_Start . Hay más de 482.751 registros en esa tabla.


En tu código donde ejecutas el procedimiento almacenado debes tener algo como esto:

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

Agregue dicha línea de código:

c.CommandTimeout = 0;

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


Encontré este error recientemente y, después de una breve investigación, descubrí que la causa era que nos quedábamos sin espacio en el disco que contiene la base de datos (menos de 1 GB).

Tan pronto como trasladé los archivos de la base de datos (.mdf y .ldf) a otro disco en el mismo servidor (con mucho más espacio), la misma página (ejecutando la consulta) que había agotado el tiempo de espera en tres segundos.

Otra cosa para investigar, mientras se intenta resolver este error, es el tamaño de los archivos de registro de la base de datos. Es posible que sus archivos de registro deban estar reducidos.


Me enfrenté con el mismo problema trabajado alrededor de 3 días. Noté que como nuestro número de registros no es mucho, nuestro desarrollador senior mantiene 2 imágenes y huellas digitales en la base de datos. Cuando trato de obtener estos valores hexadecimales que llevan mucho tiempo, calculo el tiempo promedio para ejecutar mi procedimiento en alrededor de 38 segundos. El tiempo de espera predeterminado para el comando es de 30 segundos, por lo que es menos del tiempo promedio requerido para ejecutar mi procedimiento almacenado. Puse mi comando timeout como abajo

cmd.CommandTimeout = 50

y está funcionando bien, pero a veces, si su consulta tarda más de 50 segundos, generará el mismo error.


Parece que tienes una consulta que está tardando más de lo debido. Desde el rastreo de tu pila y tu código, deberías poder determinar exactamente qué consulta es.

Este tipo de tiempo de espera puede tener tres causas;

  1. Hay un punto muerto en alguna parte
  2. Las estadísticas de la base de datos y / o el caché del plan de consultas son incorrectos.
  3. La consulta es demasiado compleja y necesita ser ajustada

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

El segundo problema hará que la base de datos utilice un plan de consulta subóptimo. Se puede resolver borrando las estadísticas:

exec sp_updatestats

Si eso no funciona, también puedes intentarlo.

dbcc freeproccache

No debe hacer esto cuando su servidor está bajo una carga pesada, ya que incurrirá temporalmente en un gran rendimiento, ya que todos los procesos y consultas almacenados se vuelven a compilar cuando se ejecutan por primera vez. Sin embargo, dado que a veces indica que el problema ocurre y el seguimiento de la pila indica que su aplicación se está iniciando, creo que está ejecutando una consulta que solo se ejecuta ocasionalmente. Puede estar en mejor situación al obligar a SQL Server a no reutilizar un plan de consulta anterior. Vea esta respuesta para obtener detalles sobre cómo hacerlo.

Ya he tocado el tercer problema, pero puede determinar fácilmente si la consulta necesita ajuste ejecutando la consulta manualmente, por ejemplo, usando Sql Server Management Studio. Si la consulta tarda demasiado tiempo en completarse, incluso después de restablecer las estadísticas probablemente necesitará ajustarla. Para obtener ayuda con eso, debe publicar la consulta exacta en una nueva pregunta.


Podría establecer la propiedad CommandTimeout del Comando SQL para permitir la transacción de SQL de larga ejecución.

Es posible que también deba consultar la consulta SQL que está causando el tiempo de espera.


Si bien todas las respuestas anteriores abordaron el problema, no cubrieron todos los casos.

Microsoft ha reconocido el problema y lo ha solucionado en 2011 para los sistemas operativos compatibles, por lo que si obtiene el seguimiento de pila como:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

Es posible que necesite actualizar sus ensamblados .NET.

Este problema se produce debido a un error en el algoritmo de reintento de conexión para las bases de datos reflejadas.

Cuando se utiliza el algoritmo de reintento, el proveedor de datos espera a que finalice la primera llamada de lectura (SniReadSync). La llamada se envía al equipo de servicios de fondo que ejecuta SQL Server y el tiempo de espera se calcula multiplicando el valor de tiempo de espera de conexión por 0.08. Sin embargo, el proveedor de datos establece incorrectamente una conexión a un estado condenado si la respuesta es lenta y si la primera llamada SniReadSync no se completa antes de que expire el tiempo de espera.

Ver KB 2605597 para más detalles.

https://support.microsoft.com/kb/2605597


Tal vez sea útil para alguien. Enfrenté el mismo problema y, en mi caso, el motivo fue que se abrió SqlConnection y no se eliminó en el método al que llamé en bucle con aproximadamente 2500 iteraciones. El conjunto de conexiones estaba agotado. La correcta disposición solucionó el problema.


Tengo problemas con el cálculo grande en sp_foo que lleva mucho tiempo, así que lo arreglé
con este pequeño código

public partial class FooEntities : DbContext { public FooEntities() : base("name=FooEntities") { this.Configuration.LazyLoadingEnabled = false; // Get the ObjectContext related to this DbContext var objectContext = (this as IObjectContextAdapter).ObjectContext; // Sets the command timeout for all the commands objectContext.CommandTimeout = 380; }


Tienes que configurar el atributo CommandTimeout. Puede establecer el atributo CommandTimeout en la clase secundaria DbContext.

public partial class StudentDatabaseEntities : DbContext { public StudentDatabaseEntities() : base("name=StudentDatabaseEntities") { this.Database.CommandTimeout = 180; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<StudentDbTable> StudentDbTables { get; set; } }


tratar

EXEC SP_CONFIGURE ''remote query timeout'', 1800 reconfigure EXEC sp_configure EXEC SP_CONFIGURE ''show advanced options'', 1 reconfigure EXEC sp_configure EXEC SP_CONFIGURE ''remote query timeout'', 1800 reconfigure EXEC sp_configure

luego reconstruye tu índice