J'exécute une page de pages Web ASP.NET qui, lors du chargement initial, tire une liste d'éléments d'un serveur SQL. Cette requête s'exécute dans une seconde ou deux et charge la page dans les 2 secondes. Le retour est d'environ 1000 enregistrements, à peu près. Je tire des noms d'hôte d'une base de données SQL de Service Manager avec d'autres informations.
Dans cette page, j'ai une recherche intégrée qui exécute essentiellement la même requête mais la lance avec un LIKE basé sur le nom d'hôte. Cela charge la même page avec tous les noms d’hôte qui contiennent une partie de la requête de recherche. La requête s'exécute généralement dans SQL Management Studio en moins d'une seconde, mais le chargement de la page prend beaucoup plus de temps et arrive parfois à expiration.
Ma question est la suivante: pourquoi la recherche par paramètre prend-elle tellement plus de temps et parfois même un délai d’expiration sans raison apparente? Existe-t-il des mesures qui peuvent être prises pour limiter ce délai? Ci-dessous est l'erreur complète.
Erreur du serveur dans '/' Application.
The wait operation timed out
Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails d'exception:
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
Trace de la pile:
[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
Information sur la version: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929
Le problème que vous rencontrez est que la commande de requête prend trop de temps. Je crois que le délai d’exécution par défaut d’une requête est de 15 secondes. Vous devez définir le CommandTimeout (en secondes) afin qu'il soit suffisamment long pour que la commande puisse terminer son exécution. Le "CommandTimeout" est différent du "Délai de connexion" dans votre chaîne de connexion et doit être défini pour chaque commande.
Dans votre sql Selecting Event, utilisez la commande:
e.Command.CommandTimeout = 60
par exemple:
Protected Sub SqlDataSource1_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
e.Command.CommandTimeout = 60
End Sub
À tous ceux qui en savent plus que moi, plutôt que de marquer cela comme inutile ou trompeur, lisez-le encore une fois. J'avais des problèmes avec ma machine virtuelle (VM) qui ne répondait plus du fait que toutes les ressources étaient consommées par des threads verrouillés. La suppression des threads est donc ma seule option. Je ne le recommande pas à ceux qui exécutent de longues requêtes, mais je peux aider ceux qui sont bloqués avec le non-réponse VM ou quelque chose du genre. C'est à chacun de prendre l'appel. Oui, cela tue votre requête mais cela a sauvé ma machine VM en cours de destruction).
Serverstack a déjà répondu à une question similaire. Il a résolu mon problème avec SQL sur VM machine. Veuillez vérifier ici
Vous devez exécuter la commande suivante pour résoudre les problèmes liés aux index.
exec sp_updatestats
Si vous utilisez Entity Framework, vous pouvez prolonger le délai d'attente par défaut (pour donner plus de temps à une requête de longue durée) en procédant comme suit:
myDbContext.Database.CommandTimeout = 300;
Où myDbContext
est votre instance de DbContext et 300
est la valeur du délai d'attente en secondes.
(Syntaxe actuelle à partir de Entity Framework 6.)
J'ai eu le même problème. Fonctionnement exec sp_updatestats
fonctionnait parfois, mais pas toujours. J'ai décidé d'utiliser l'instruction NOLOCK
dans mes requêtes pour accélérer les requêtes. Ajoutez simplement NOLOCK
après votre clause FROM, par exemple:
SELECT clicks.entryURL, clicks.entryTime, sessions.userID
FROM sessions, clicks WITH (NOLOCK)
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())
Lire l'article complet ici .
Regardez dans les tables de réindexation de votre base de données.
Vous pouvez d’abord déterminer le niveau de fragmentation - et s’il dépasse 10% environ, vous pourriez tirer parti d’une réindexation. Si elle est très élevée, il est probable que cela crée un goulot d'étranglement de performances significatif.
Cela devrait être fait régulièrement.
J'ai essayé les autres réponses ici ainsi que quelques autres. J'ai même arrêté et redémarré les services SQL. Rien n'a fonctionné.
Cependant, le redémarrage de mon ordinateur a fonctionné.
Nous avons rencontré cette erreur après une mise à niveau de 2008 à 2014 de SQL Server, où certaines de nos chaînes de connexion précédentes pour le développement local avaient une source de données =./Like this
<add name="MyLocalDatabase" connectionString="Data Source=./;Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
Le changement de ./ en (local) ou localhost a résolu le problème.
<add name="MyLocalDatabase" connectionString="Data Source=(local);Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
Ma table n'avait pas de clé primaire alors j'avais une erreur de time out. après avoir réglé la clé sloved.
Ce problème se produira en raison du temps d'exécution de la commande sqlcommand. Définissez le CommandTimeout = 100 ou la valeur souhaitée
Valeur de délai d'attente en secondes @Remarque Il est préférable de fournir la valeur optimale