390 votes

Temps mort expiré. Le délai d'attente s'est écoulé avant l'achèvement de l'opération ou le serveur ne répond pas. La déclaration a été interrompue

veuillez voir l'erreur ci-dessous :

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

Je suis vraiment confus au sujet de cette erreur,
J'ai beaucoup d'utilisateurs sur mon site web (20000~60000 par jour)(un site de téléchargement de fichiers mobiles) et j'ai un accès distant à mon serveur (Windows server 2008-R2).
parfois, j'ai server is unavailable error mais je n'avais pas vu d'erreur de délai de connexion jusqu'à présent.
pourquoi cette erreur se produit-elle et comment puis-je la corriger ?

MODIFIER APRÈS LES RÉPONSES :
mon Application_Start dans Global.asax est comme ci-dessous :

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

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

et cette procédure stockée :

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

J'ai deux méthodes pour obtenir des utilisateurs en ligne.
1-utilisant Application["OnlineUsers"] = 0 ;
2-l'autre utilisant la base de données.

Donc, pour la méthode n°2, je dois réinitialiser tous les OnlineUsers At Application_Start.
et il y a plus de 482 751 enregistrements dans cette table.

1 votes

1 votes

Il est préférable de faire une analyse des causes profondes. Il y a plusieurs raisons qui peuvent causer un tel problème. La plus basique est la structure complexe de la requête. J'ai rencontré le même problème lorsque j'ai récupéré des images stockées sous forme de valeurs hexadécimales dans une table.

0 votes

Outre les causes ci-dessus, je vais en ajouter une autre : Le délai de verrouillage : docs.microsoft.com/fr-us/sql/t-sql/statements/ Si ce thread attend le verrou trop longtemps, il va perdre son temps en fonction du document ci-dessus.

417voto

Marnix van Valen Points 6197

Il semble qu'une de vos requêtes prenne plus de temps qu'elle ne devrait. À partir de votre trace de pile et de votre code, vous devriez être en mesure de déterminer exactement de quelle requête il s'agit.

Ce type de délai d'attente peut avoir trois causes ;

  1. Il y a une impasse quelque part
  2. Les statistiques de la base de données et/ou le cache du plan de requête sont incorrects.
  3. La requête est trop complexe et doit être optimisée.

Un blocage peut être difficile à résoudre, mais il est facile de déterminer si c'est le cas. Connectez-vous à votre base de données avec Sql Server Management Studio. Dans le volet de gauche, cliquez avec le bouton droit de la souris sur le nœud du serveur et sélectionnez Moniteur d'activité . Jetez un coup d'œil aux processus en cours. Normalement, la plupart sont inactifs ou en cours d'exécution. Lorsque le problème survient, vous pouvez identifier tout processus bloqué grâce à l'état du processus. Si vous cliquez avec le bouton droit de la souris sur le processus et sélectionnez détails cela vous montrera la dernière requête exécutée par le processus.

Le deuxième problème fait que la base de données utilise un plan de requête sous-optimal. Il peut être résolu en effaçant les statistiques :

exec sp_updatestats

Si cela ne fonctionne pas, vous pouvez aussi essayer

dbcc freeproccache

Vous ne devez pas le faire lorsque votre serveur est très sollicité, car cela entraînera temporairement une baisse importante des performances, car toutes les procédures et requêtes stockées sont recompilées lors de leur première exécution. Cependant, puisque vous dites que le problème se produit parfois et la trace de la pile indique que votre application démarre, je pense que vous exécutez une requête qui n'est exécutée qu'occasionnellement. Vous feriez mieux de forcer le serveur SQL à ne pas réutiliser un plan de requête précédent. Voir cette réponse pour plus de détails sur la façon de le faire.

J'ai déjà abordé le troisième point, mais vous pouvez facilement déterminer si la requête doit être ajustée en l'exécutant manuellement, par exemple à l'aide de Sql Server Management Studio. Si la requête prend trop de temps à se terminer, même après avoir réinitialisé les statistiques, vous aurez probablement besoin de l'ajuster. Pour obtenir de l'aide à ce sujet, vous devez envoyer la requête exacte dans une nouvelle question.

46 votes

J'avais la même erreur, mais dans une requête qui n'a pris "que" 8 secondes... et votre conseil à propos de l'option exec sp_updatestats a résolu mon problème. Merci beaucoup !

3 votes

La résolution d'un tel problème ne consiste presque jamais à régler les délais d'attente ou la taille du pool de connexion. Vous devez vous plonger dans le problème et en déterminer la cause profonde. Si vous avez besoin d'aide pour résoudre cette cause fondamentale, vous pouvez poster votre propre question.

8 votes

Ce n'est certainement pas une impasse. Il peut être causé par un blocage excessif, mais les blocages sont résolus en une seconde, et ils génèrent des erreurs différentes. Cela peut être un blocage excessif, mais pas une impasse.

183voto

Elastep Points 967

Dans votre code où vous exécutez la procédure stockée, vous devriez avoir quelque chose comme ceci :

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

Ajoutez une telle ligne de code :

c.CommandTimeout = 0;

Cela permettra d'attendre le temps nécessaire à la réalisation de l'opération.

178 votes

Vous devez également savoir que la valeur 0 n'est pas recommandé : Une valeur de 0 n'indique aucune limite, et devrait être évitée dans un CommandTimeout car une tentative d'exécution d'une commande attendra indéfiniment. Il est préférable d'apprendre combien de temps la commande prend, et d'augmenter la valeur de Timeout si nécessaire.

9 votes

Je suis d'accord avec Otiel et j'ai rétrogradé votre réponse : En fixant le commandTimeout à 0, vous ne donnez pas au serveur web une chance de se remettre d'un serveur de base de données qui ne répond pas. Deuxièmement, lorsque vous fixez le délai par défaut, vous devriez envisager d'en rechercher la cause. Dans la plupart des cas, il est préférable de corriger la requête plutôt que d'augmenter le délai d'attente.

19 votes

Je ne tomberais pas dans le piège de ne pas le recommander. Il a été très utile pour moi et mes tâches quotidiennes programmées : Le fait d'avoir un délai d'attente infini n'empêche pas un processus de se terminer et de renvoyer une erreur si quelque chose ne va pas. En d'autres termes, cela vous permet simplement de permettre à une requête de se terminer quand elle le doit, sans vous poser de problèmes par la suite, parce que vous n'aviez pas alloué suffisamment de temps pour que le processus se termine. Vous pouvez également éviter de verrouiller votre programme en utilisant le multithreading.

34voto

Kev Ritchie Points 945

Vous pourriez définir le CommandTimeOut de la commande SQL pour permettre l'exécution d'une transaction SQL de longue durée ou vous devez examiner la requête SQL à l'origine du délai d'attente.

0 votes

Bonjour, "ou vous devez regarder la requête SQL qui cause le timeout" -> dans sql server 2008, où dois-je vérifier ce timeout ?

0 votes

Il se peut que vous deviez tester la procédure stockée appelée par DataLayer.OnlineUsers.Update_SessionEnd_And_Online, car la trace de la pile semble l'indiquer. Prenez une copie de la base de données en direct dans le test et exécutez la procédure stockée en passant les paramètres requis, si cela prend plus de 30 secondes pour terminer, c'est la raison pour laquelle vous obtenez un time out. Je suppose que vous avez accès à SQL Server Management Studio.

0 votes

Oui, j'ai accès à sql server 2008. je devrais essayer votre méthode.

2voto

kolin Points 1270

J'ai utilisé ce :

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

d'identifier les requêtes lentes et, par conséquent, de les optimiser (davantage).

2voto

ARS Points 1763

@SilverLight.. C'est clairement un problème avec un objet de la base de données. Cela peut être une requête mal écrite, ou des index manquants. Mais pour l'instant, je ne vous suggérerai pas d'augmenter le délai d'attente sans examiner le problème avec vos objets de base de données.

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

Placez un point d'arrêt sur cette ligne de code pour connaître le nom de la procédure, puis optimisez la procédure en examinant son plan d'exécution.

Je ne peux pas vous aider davantage tant que vous n'aurez pas posté les détails de la procédure stockée.

0 votes

La procédure stockée ne fait rien de spécial. Cependant, il semble que la table OnlineUsers soit verrouillée pendant l'exécution de la procédure. Essayez le profileur SQL pour voir ce qui se passe au démarrage de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X