2013-05-03 20 views
34

Sto eseguendo una pagina di pagine Web ASP.NET che al caricamento iniziale estrae un elenco di elementi da un server SQL. Questa query viene eseguita in un secondo circa e carica la pagina entro 2 secondi. Il rendimento è di circa 1000 record, dare o avere. Sto tirando Hostnames da un database SQL di Service Manager insieme ad alcune altre informazioni.Win32Exception (0x80004005): Timeout dell'operazione di attesa

All'interno di questa pagina, ho una ricerca incorporata che esegue essenzialmente la stessa query ma la esegue con un LIKE basato su hostname. Carica la stessa pagina con tutti i nomi host che contengono parte della query di ricerca. La query generalmente viene eseguita in SQL Management Studio in meno di un secondo, ma il caricamento della pagina richiede tempi notevolmente più lunghi ea volte scadono.

La mia domanda è, perché la ricerca basata su parametri richiede molto più tempo e talvolta si interrompe senza un motivo apparente. Ci sono dei passi che possono essere presi per mitigare questo timeout? Di seguito è riportato l'errore completo.

Errore server nell'applicazione '/'.


The wait operation timed out 

Descrizione: 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.ComponentModel.Win32Exception: The wait operation timed out 
Source Error: 

Line 13:  } 
Line 14:  
Line 15:  var selectedData = db.Query(selectCommand, searchTerm); 
Line 16: 
Line 17: 

Source File: c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml Line: 15 

Stack Trace:

[Win32Exception (0x80004005): The wait operation timed out] 
[SqlException (0x80131904): 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) +1753346 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295154 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242 
    System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682 
    System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +59 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +90 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1325 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41 
    System.Data.Common.DbCommand.ExecuteReader() +12 
    WebMatrix.Data.<QueryInternal>d__0.MoveNext() +152 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 
    WebMatrix.Data.Database.Query(String commandText, Object[] parameters) +103 
    ASP._Page_servers_default_cshtml.Execute() in c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml:15 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197 
    System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +69 
    System.Web.WebPages.WebPage.ExecutePageHierarchy() +151 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76 
    System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114 

Versione Informazioni: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

risposta

20

A tutti coloro che sanno più di me, piuttosto che la marcatura è inutile o fuorviante, leggerlo ancora una volta Ho avuto problemi con la mia macchina virtuale (VM) che non rispondeva a causa di tutte le risorse consumate da thread bloccati, quindi l'uccisione dei thread è l'unica opzione che ho avuto. Non sto raccomandando questo a chiunque stia eseguendo query lunghe, ma può aiutare chi è bloccato con VM non risponde o qualcosa del genere. I suoi individui fino a prendere la chiamata. Sì, ucciderà la tua query ma ha salvato la mia macchina virtuale distrutta.

La server ha già risposto a una domanda simile. Ha risolto il mio problema con SQL su macchina VM. Controllare here

È necessario eseguire il seguente comando per risolvere i problemi con gli indici.

exec sp_updatestats 
+1

Questo ha funzionato per me! :) – BugLover

+16

Questa non è una risposta generalmente applicabile, vale a dire che le query possono essere eseguite più a lungo di qualsiasi timeout determinato, indipendentemente dal fatto che le statistiche dell'indice siano state aggiornate di recente. –

+1

Assicurarsi di leggere e comprendere le conseguenze di exec sp_updatestats prima dell'esecuzione. – redoc

29

Il problema riscontrato è che il comando di query impiega troppo tempo. Credo che il timeout predefinito per una query da eseguire sia 15 secondi. È necessario impostare CommandTimeout (in secondi) in modo che sia sufficientemente lungo da consentire al comando di completare l'esecuzione. Il "CommandTimeout" è diverso da "Timeout connessione" nella stringa di connessione e deve essere impostato per ciascun comando.

nel vostro evento SQL Selezione, utilizzare il comando:

e.Command.CommandTimeout = 60 

ad esempio:

Protected Sub SqlDataSource1_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) 
    e.Command.CommandTimeout = 60 
End Sub 
+0

Ho appena risolto questo problema su un'app Web in cui la query stava effettivamente impiegando troppo tempo - perché nessuno aveva creato un indice sul DB per il campo che si stava interrogando! Questo dovrebbe essere stato il primo punto di chiamata :) –

3

Ho provato le altre risposte qui così come pochi altri. Ho persino interrotto e riavviato i servizi SQL. Niente ha funzionato

Tuttavia, il riavvio del computer ha funzionato.

+0

Yupe, anche per me il riavvio ha funzionato. – incomplete

+0

Funziona per un po ', ma il problema si ripresenta e richiede un altro riavvio, esiste una correzione permanente effettiva? – BlackICE

+0

@BlackICE Non l'ho fatto tornare. – MiniRagnarok

5

Ho avuto lo stesso problema. L'esecuzione di exec sp_updatestats ha funzionato a volte, ma non sempre. Ho deciso di utilizzare l'istruzione NOLOCK nelle mie query per velocizzare le query. Basta aggiungere NOLOCK dopo la vostra clausola FROM, per es .:

SELECT clicks.entryURL, clicks.entryTime, sessions.userID 
FROM sessions, clicks WITH (NOLOCK) 
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE()) 

Leggi l'articolo completo here.

+0

NOLOCK è un'ottima soluzione quando il tuo server sta facendo un sacco di lavoro multiutente o un sacco di roba di report a lungo termine! –

+3

NOLOCK è in genere una soluzione non valida per la maggior parte dei problemi. (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/): 1) "Leggi Dirty" 2) Manca righe righe 3) Lettura due volte 4) La lettura più versioni dello stessa riga 5) Indice corruzione 6) Leggere l'errore e altro. Solo Google 'NOLOCK cattiva idea' ... (P.S. Snapshot Isolation potrebbe essere tuo amico in alcuni casi) – HansLindgren

+1

Non sono d'accordo che l'uso di NOLOCK sia "di solito una brutta soluzione per molti problemi". Dipende davvero dal problema in questione e capisci cosa sta facendo NOLOCK. Ci sono alcuni scenari in cui la perfezione complessiva dei dati non è molto importante. Esistono anche scenari in cui è possibile: in tal caso, è necessario ridurre al minimo il tempo/tempo di query speso con le tabelle bloccate. – Paul

2

Abbiamo incontrato questo errore dopo un aggiornamento 2008-2014 SQL Server in cui il nostro alcuni dei nostri stringhe di connessione precedenti per lo sviluppo locale ha avuto un Data Source =./Ti piace questa

 <add name="MyLocalDatabase" connectionString="Data Source=./;Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/> 

Modifica che dal ./ a sia (locale) o localhost risolto il problema.

<add name="MyLocalDatabase" connectionString="Data Source=(local);Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/> 
+0

Ho avuto lo stesso problema dopo l'aggiornamento da SQL Server 2012 al 2014. Il server SQL e il server Web erano su macchine diverse ma cambiando l'origine dati da 'SERVER' a' SERVER.domain.local' _seems_ per risolverlo. – Darren

0

La mia tabella non aveva la chiave primaria, quindi ho avuto un errore di timeout. dopo aver impostato la chiave sloved.

4

Se stai usando Entity Framework, è possibile estendere il timeout predefinito (per dare una lunga esecuzione di query più tempo per completare) facendo:

myDbContext.Database.CommandTimeout = 300; 

Dove myDbContext è l'istanza DbContext, e 300 è il valore di timeout in secondi.

(corrente Sintassi come di Entity Framework 6.)

Problemi correlati