it-swarm.it

Timeout scaduto. Il periodo di tempo è scaduto prima del completamento La dichiarazione è stata chiusa

Ho molti utenti sul mio sito web (20000-60000 al giorno), che è un sito di download per i file mobili. Ho accesso remoto al mio server (Windows Server 2008-R2).
Ho ricevuto "Il server non è disponibile" errori prima, ma ora sto vedendo un errore di timeout della connessione.
Non ho familiarità con questo - perché si verifica e come posso risolverlo?

L'errore completo è qui sotto:

Errore del server nell'applicazione '/' Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa. Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.Data.SqlClient.SqlException: Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa.

Errore di origine:

Un'eccezione non gestita è stata generata durante l'esecuzione della richiesta web corrente. Le informazioni relative all'origine e alla posizione dell'eccezione possono essere identificate utilizzando la traccia dello stack di eccezioni di seguito.

Stack Trace:

[SqlException (0x80131904): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Data.SqlClient.SqlConnection.OnError (eccezione SqlException, booleano 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 (risultato DbAsyncResult, String metodoName, Booleano 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 (Oggetto mittente, EventArgs e) +163

[HttpException (0x80004005): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (contesto HttpContext, app HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, contesto HttpContext, MethodInfo [] handler) +191
System.Web.HttpApplication.InitSpecial (stato HttpApplicationState, MethodInfo [] handler, IntPtr appContext, contesto HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, contesto HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375

[HttpException (0x80004005): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Web.HttpRuntime.FirstRequestInit (contesto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contesto HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, contesto HttpContext) +4863749


MODIFICA DOPO LE RISPOSTE:
il mio Application_Start in Global.asax è come di seguito:

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

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

La procedura memorizzata chiamata è:

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

Ho due metodi per ottenere utenti online:

  1. usando Application["OnlineUsers"] = 0;
  2. l'altro usando il database

Quindi, per il metodo # 2 ho resettato tutti gli utenti online su Application_Start. Ci sono oltre 482.751 record in quella tabella.

258
SilverLight

Sembra che tu abbia una query che impiega più tempo di quanto dovrebbe. Dalla traccia dello stack e dal codice, dovresti essere in grado di determinare esattamente quale query è.

Questo tipo di timeout può avere tre cause;

  1. C'è un punto morto da qualche parte
  2. Le statistiche del database e/o la cache del piano di query non sono corrette
  3. La query è troppo complessa e deve essere ottimizzata

Un deadlock può essere difficile da risolvere, ma è facile determinare se questo è il caso. Collegati al tuo database con Sql Server Management Studio. Nel riquadro sinistro, fare clic con il pulsante destro del mouse sul nodo del server e selezionare Monitoraggio attività . Dai un'occhiata ai processi in corso. Normalmente la maggior parte sarà inattiva o in esecuzione. Quando si verifica il problema, è possibile identificare qualsiasi processo bloccato dallo stato del processo. Se fai clic con il tasto destro del mouse sul processo e selezioni dettagli ti mostrerà l'ultima query eseguita dal processo.

Il secondo problema farà sì che il database utilizzi un piano di query sub-ottimale. Può essere risolto cancellando le statistiche:

exec sp_updatestats

Se non funziona, potresti provare anche tu

dbcc freeproccache

Non dovresti farlo quando il tuo server è sotto carico pesante perché incorrerà temporaneamente in un grande colpo di performance dato che tutti i proc e le query memorizzati vengono ricompilati quando vengono eseguiti per la prima volta. Tuttavia, poiché si afferma che il problema si verifica a volte , e la traccia dello stack indica che l'applicazione è in fase di avvio, penso che si stia eseguendo una query che viene eseguita solo occasionalmente. Potresti stare meglio costringendo SQL Server a non riutilizzare un piano di query precedente. Vedi questa risposta per i dettagli su come farlo.

Ho già toccato il terzo numero, ma è possibile determinare facilmente se la query necessita di ottimizzazione eseguendo manualmente la query, ad esempio utilizzando Sql Server Management Studio. Se la query impiega troppo tempo per essere completata, anche dopo aver ripristinato le statistiche, probabilmente dovrai regolarla. Per aiuto, dovresti pubblicare la query esatta in una nuova domanda.

301
Marnix van Valen

Nel codice in cui esegui la procedura memorizzata dovresti avere qualcosa del genere:

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

Aggiungi una riga di codice simile:

c.CommandTimeout = 0;

Ciò attenderà tutto il tempo necessario per completare l'operazione.

135
Elastep

È possibile impostare la proprietà CommandTimeout del comando SQL per consentire la transazione SQL con esecuzione prolungata.

Potrebbe anche essere necessario esaminare la query SQL che causa il timeout.

23
Kev Ritchie

Mentre tutte le risposte precedenti affrontano il problema, non coprivano tutti i casi.

Microsoft ha riconosciuto il problema e l'ha corretto nel 2011 per i sistemi operativi supportati, quindi se si ottiene lo stack trace come:

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)

potrebbe essere necessario aggiornare gli assembly .NET.

Questo problema si verifica a causa di un errore nell'algoritmo connection-retry per i database con mirroring.

Quando viene utilizzato l'algoritmo retry, il fornitore di dati attende la prima chiamata di lettura (SniReadSync) per terminare. La chiamata viene inviata al computer di back-end che esegue SQL Server e il tempo di attesa viene calcolato moltiplicando il valore di timeout della connessione di 0,08. Tuttavia, il provider di dati imposta erroneamente una connessione a uno stato destinato a mancare se una risposta è lenta e se la prima chiamata SniReadSync non viene completata prima della scadenza del tempo di attesa.

Vedi KB 2605597 per i dettagli

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

12
matcheek

Forse sarà utile per qualcuno. Ho affrontato lo stesso problema e nel mio caso il motivo era che SqlConnection era aperto e non disposto nel metodo che ho chiamato in loop con circa 2500 iterazioni. Il pool di connessione era esaurito. Lo smaltimento corretto ha risolto il problema.

9
eternity

Ho affrontato lo stesso problema su di esso per circa 3 giorni. Ho notato che il nostro numero di record non è tanto il nostro sviluppatore senior conserva 2 immagini e impronte digitali nel database. Quando provo a recuperare questi valori esadecimali, impiegando molto tempo, calcolo il tempo medio per eseguire la mia procedura di circa 38 secondi. Il timeout di comando predefinito è 30 secondi, quindi è necessario meno del tempo medio necessario per eseguire la stored procedure. Ho impostato il mio comando timeout come di seguito

cmd.CommandTimeout = 50

e funziona bene, ma a volte se la query richiede più di 50 secondi, verrà richiesto lo stesso errore.

6
Vijay Kumbhoje

Devi impostare l'attributo CommandTimeout. È possibile impostare l'attributo CommandTimeout nella classe figlio 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; }
}
5
Siddarth Kanted

Recentemente ho riscontrato questo errore e, dopo alcune brevi indagini, ho scoperto che stavamo esaurendo lo spazio sul disco contenente il database (meno di 1 GB).

Non appena ho spostato i file del database (.mdf e .ldf) su un altro disco sullo stesso server (con molto più spazio), la stessa pagina (eseguendo la query) che era scaduta veniva caricata entro tre secondi.

Un'altra cosa su cui indagare, nel tentativo di risolvere questo errore, è la dimensione dei file di registro del database. Potrebbe essere necessario ridurre i file di registro.

4
Hafiz Adewuyi

Ho problemi con il calcolo di grandi dimensioni in sp_foo che richiedono molto tempo, quindi ho risolto
con questo piccolo bit di codice

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;
    }
3
Nabeel Iqbal

@ Silverlight. Questo è chiaramente un problema con un oggetto Database. Può essere una query scritta male o indici mancanti. Ma per ora non ti suggerisco di aumentare il timeout senza indagare sul problema con gli oggetti del Database

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

Inserire un punto di interruzione su questa riga di codice per trovare il nome della procedura e quindi ottimizzare la procedura osservando il suo piano di esecuzione.

Non posso aiutarti di più fino al momento della pubblicazione dei dettagli sulla stored procedure.

2
Amit Rai Sharma

provare

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

quindi ricostruisci il tuo indice

1
maksoud

Timeout scaduto perché la query sql impiega più tempo di quella impostata nella proprietà sqlCommand.CommandTimeout.

Ovviamente è possibile aumentare CommandTimeout per risolvere questo problema, ma prima di farlo è necessario ottimizzare la query aggiungendo l'indice. Se si esegue la query in Sql server management studio incluso piano di esecuzione effettivo quindi Sql server management studio suggerirà un indice corretto. Nella maggior parte dei casi, si eliminerà il problema di timeout se è possibile ottimizzare la query.

0
Khabir

Il timeout predefinito è 15 secondi, per cambiarlo, 0 è illimitato, qualsiasi altro numero è il numero di secondi.

Nel codice

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

In Your Web.Config, "Command Timeout = 0;" non timeout o inferiore a un'ora (3600 secondi)

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />
0
David C Fuchs