Domanda

Ho un comportamento curioso che non riesco a capire perché si sta verificando.Vedo eccezioni di timeout intermittenti.Sono abbastanza sicuro che sia correlato al volume perché non è riproducibile nel nostro ambiente di sviluppo.Come soluzione provvisoria, ho provato ad aumentare il timeout del comando sql a sessanta secondi, ma come ho scoperto, questo non sembra essere d'aiuto.Ecco la parte strana, quando controllo i miei registri sul processo che non riesce, ecco gli orari di inizio e fine:

  • 09/16/2008 16:21:49
  • 09/16/2008 16:22:19

Allora come è possibile che il timeout scada tra trenta secondi quando ho impostato il timeout del comando su sessanta??

Solo per riferimento, ecco l'eccezione lanciata:

System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader()
   at SetClear.DataAccess.SqlHelper.ExecuteReader(CommandType commandType, String commandText, SqlParameter[] commandArgs)
È stato utile?

Soluzione

I comandi SQL scadono perché la query che stai utilizzando richiede più tempo per essere eseguita.Eseguirlo in Query Analyser o Management Studio, con una quantità rappresentativa di dati nel database, e guarda il piano di esecuzione per scoprire cosa è lento.

Se qualcosa richiede una grande percentuale di tempo ed è descritto come una "scansione di tabella" o "scansione di indici cluster", verifica se è possibile creare un indice che trasformi tale operazione in una ricerca di chiavi (una ricerca di indici o indici cluster cercare).

Altri suggerimenti

Può sembrare stupido, ma ascoltami.Controlla tutti gli indici e le chiavi primarie coinvolte nella tua query.Esistono?Sono frammentati?Ho avuto un problema in cui, per qualche motivo, l'esecuzione dello script funzionava perfettamente, ma poi quando l'ho fatto tramite l'applicazione, era lento come un matto.Fondamentalmente il lettore si comporta come un cursore, quindi l'indicizzazione è estremamente importante.

Potrebbe non essere questo, ma è sempre la prima cosa che controllo.

Prova a modificare la proprietà timeout di SqlConnection, anziché quella del comando

Perché il timeout si verifica sulla connessione, non sul comando.È necessario impostare il connesione finita proprietà

Ho avuto questo problema una volta e l'ho rintracciato in un codice SQL davvero inefficiente in una delle visualizzazioni del mio database.Qualcuno aveva inserito una condizione complessa con una sottoquery nella clausola ON per un join di tabella, invece che nella clausola WHERE a cui apparteneva.Una volta corretto questo errore, il problema è scomparso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top