J'ai de nombreux utilisateurs sur mon site Web (20000-60000 par jour), qui est un site de téléchargement de fichiers mobiles. J'ai un accès à distance à mon serveur (serveur Windows 2008-R2).
J'ai déjà reçu des erreurs «Le serveur n'est pas disponible» , mais je vois maintenant une erreur de délai de connexion.
Je ne connais pas cela - pourquoi cela se produit-il et comment puis-je le corriger?
L'erreur complète est ci-dessous:
Erreur serveur dans l'application '/' Le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. La déclaration est terminée. Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails de l'exception: System.Data.SqlClient.SqlException: le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. La déclaration est terminée.
Erreur source:
Une exception non gérée a été générée lors de l'exécution de la demande Web actuelle. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.
Trace de la pile:
[SqlException (0x80131904): le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. L'instruction est terminée.]
System.Data.SqlClient.SqlConnection.OnError (exception SqlException, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParser.Run (RunBB , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReaderS3, String + RunBeServices, B6)
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReadeBordBehavior, RunBehavior, RunBe 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (résultat DbAsyncResult, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
Paramètres NovinMedia.Data.DbObject.RunProced [StringProcedName , Int32 et lignes affectées) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (expéditeur d'objet, EventArgs e) +163[HttpException (0x80004005): le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. L'instruction a été terminée.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (contexte HttpContext, application HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext) ApplicationContextWordInfo
. InitSpecial (état HttpApplicationState, gestionnaires MethodInfo [], IntPtr appContext, contexte HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRapp + Application[HttpException (0x80004005): le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. L'instruction a été arrêtée.]
System.Web.HttpRuntime.FirstRequestInit (contexte HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contexte HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationWorkContext
EDIT APRÈS REPONSES:
mon Application_Start
en 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);
}
La procédure stockée appelée est:
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:
- en utilisant
Application["OnlineUsers"] = 0;
- l'autre utilisant la base de données
Donc, pour la méthode # 2, je réinitialise tous les OnlineUsers à Application_Start
. Il y a plus de 482 751 enregistrements dans ce tableau.
la source
Réponses:
Il semble que votre requête prenne plus de temps que prévu. À partir de votre trace de pile et de votre code, vous devriez pouvoir déterminer exactement de quelle requête il s'agit.
Ce type de délai d'attente peut avoir trois causes;
Un blocage peut être difficile à résoudre, mais il est facile de déterminer si tel est le cas. Connectez-vous à votre base de données avec Sql Server Management Studio. Dans le volet gauche, cliquez avec le bouton droit sur le nœud du serveur et sélectionnez Moniteur d'activité . Jetez un œil aux processus en cours. Normalement, la plupart seront inactifs ou en cours d'exécution. Lorsque le problème se produit, vous pouvez identifier tout processus bloqué par l'état du processus. Si vous cliquez avec le bouton droit sur le processus et sélectionnez les détails, il vous montrera la dernière requête exécutée par le processus.
Le deuxième problème obligera la base de données à utiliser un plan de requête sous-optimal. Il peut être résolu en effaçant les statistiques:
Si cela ne fonctionne pas, vous pouvez également essayer
Vous ne devriez pas le faire lorsque votre serveur est soumis à une charge importante, car il encourra temporairement un grand hit de performance car tous les proc et requêtes stockés sont recompilés lors de leur première exécution. Cependant, étant donné que vous déclarez que le problème se produit parfois et que la trace de 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 pouvez être mieux en forçant SQL Server à 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 procéder.
J'ai déjà abordé le troisième problème, mais vous pouvez facilement déterminer si la requête doit être optimisée en exécutant la requête manuellement, par exemple en utilisant Sql Server Management Studio. Si la requête prend trop de temps, même après la réinitialisation des statistiques, vous devrez probablement la régler. Pour obtenir de l'aide, vous devez publier la requête exacte dans une nouvelle question.
la source
exec sp_updatestats
résolution de mon problème. Merci beaucoup!Dans votre code où vous exécutez la procédure stockée, vous devriez avoir quelque chose comme ceci:
Ajoutez une telle ligne de code:
Cela attendra autant de temps que nécessaire pour terminer l'opération.
la source
Vous pouvez définir la
CommandTimeout
propriété de la commande SQL pour autoriser la transaction SQL de longue durée.Vous devrez peut-être également consulter la requête SQL à l'origine du délai d'expiration.
la source
Bien que toutes les réponses antérieures traitent du problème, elles ne couvraient pas tous les cas.
Microsoft a reconnu le problème et l'a corrigé en 2011 pour les systèmes d'exploitation pris en charge, donc si vous obtenez la trace de la pile comme:
vous devrez peut-être mettre à jour vos assemblys .NET.
Voir KB 2605597 pour plus de détails
https://support.microsoft.com/kb/2605597
la source
Ce sera peut-être utile à quelqu'un. J'ai fait face au même problème et dans mon cas, la raison était que SqlConnection a été ouvert et non supprimé dans la méthode que j'ai appelée en boucle avec environ 2500 itérations. Le pool de connexions a été épuisé. Une élimination appropriée a résolu le problème.
la source
using
blocs), j'ai ce problème de délai d'attente. Cela semblait le résoudre.J'ai fait face au même problème que j'ai travaillé environ 3 jours. J'ai remarqué que notre nombre d'enregistrements n'est pas beaucoup, notre développeur principal conserve 2 images et empreintes digitales dans la base de données. Lorsque j'essaie de récupérer ces valeurs hexadécimales, cela prend beaucoup de temps, je calcule le temps moyen pour exécuter ma procédure, c'est environ 38 secondes. Le délai d'expiration de la commande par défaut est de 30 secondes, donc son temps inférieur à la moyenne requis pour exécuter ma procédure stockée. J'ai défini mon délai de commande comme ci-dessous
et son bon fonctionnement mais parfois, si votre requête prend plus de 50 secondes, il provoquera la même erreur.
la source
Vous devez définir l'attribut CommandTimeout. Vous pouvez définir l'attribut CommandTimeout dans la classe enfant DbContext.
la source
J'ai rencontré cette erreur récemment et après une brève enquête, j'ai constaté que nous manquions d'espace sur le disque contenant la base de données (moins de 1 Go).
Dès que j'ai déplacé les fichiers de base de données (.mdf et .ldf) vers un autre disque sur le même serveur (avec beaucoup plus d'espace), la même page (exécutant la requête) qui avait expiré s'est chargée en trois secondes.
Une autre chose à étudier, tout en essayant de résoudre cette erreur, est la taille des fichiers journaux de la base de données. Vos fichiers journaux devront peut-être être réduits.
la source
J'ai un problème avec les gros calculs dans sp_foo qui prennent beaucoup de temps, donc j'ai corrigé
avec ce petit code
la source
Le délai d'expiration par défaut est de 15 secondes, pour changer cela, 0 est illimité, tout autre nombre est le nombre de secondes.
Dans du code
Dans votre Web.Config, "Délai d'expiration de la commande = 0;" ne pas expirer, ou comme ci-dessous 1 heure (3600 secondes)
la source
@SilverLight .. Il s'agit clairement d'un problème avec un objet Database. Il peut s'agir d'une requête mal écrite ou d'index manquants. Mais pour l'instant, je ne vous suggérerai pas d'augmenter le délai sans enquêter sur le problème avec vos objets de base de données
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 consultant son plan d'exécution.
Je ne peux pas vous aider davantage jusqu'à ce que vous publiez des détails sur la procédure stockée.
la source
essayer
puis reconstruisez votre index
la source
la source
TLDR :
J'ai souvent rencontré cette erreur pour diverses raisons et j'ai eu différentes solutions, notamment:
la source
Assurez-vous également que vous n'avez pas de transaction en attente. :)
Je faisais des tests et j'ai commencé une transaction pour être sûre mais je ne l'ai jamais clôturée. Je souhaite que l'erreur aurait été plus explicite mais bon!
la source
Nous avons eu des moments difficiles
Timeout expired/max pool reached
Sqlexception
. Pour contourner le problème et pour empêcher le redémarrage du serveur ou du service, nous modifions laMAX SERVER MEMORY
variable dans SQL Server (via SQL Managment Studio ou T-SQL):Cela résout temporairement le problème jusqu'à ce qu'il se reproduise. Dans notre cas, nous soupçonnons qu'il s'agit de fuites de connexion au niveau de l'application.
la source
Nous avons récemment mis à niveau vers la version NuGet de
SqlClient
(Microsoft.Data.SqlClient
) qui contient un bogue . Ce bogue a été introduit pendant la durée de vie du cycle 1.x et a déjà été corrigé. Le correctif sera disponible dans la version 2.0.0 qui n'est pas disponible au moment d'écrire ces lignes. Un aperçu est disponible.Vous pouvez consulter les détails ici: https://github.com/dotnet/SqlClient/issues/262
la source