Ich habe viele Benutzer auf meiner Website (20000-60000 pro Tag), die eine Download-Site für mobile Dateien ist. Ich habe Remotezugriff auf meinen Server (Windows Server 2008-R2).
Ich habe bereits Fehler "Server ist nicht verfügbar" erhalten , sehe jetzt jedoch einen Verbindungszeitüberschreitungsfehler.
Ich bin damit nicht vertraut - warum tritt es auf und wie kann ich es beheben?
Der vollständige Fehler ist unten:
Serverfehler in '/' Anwendung. Zeitüberschreitung. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet. Beschreibung: Während der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stapelverfolgung, um weitere Informationen über den Fehler und dessen Ursprung im Code zu erhalten.
Ausnahmedetails: System.Data.SqlClient.SqlException: Zeitüberschreitung abgelaufen. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet.
Quellfehler:
Während der Ausführung der aktuellen Webanforderung wurde eine nicht behandelte Ausnahme generiert. Informationen zum Ursprung und Ort der Ausnahme können mithilfe der folgenden Ausnahmestapelverfolgung identifiziert werden.
Stapelverfolgung:
[SqlException (0x80131904): Zeitüberschreitung abgelaufen. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet.]
System.Data.SqlClient.SqlConnection.OnError (SqlException-Ausnahme, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsBars , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet BulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataBeaReaReaRe
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult-Ergebnis, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMediaPar , Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (Objektabsender, EventArgs e) +163[HttpException (0x80004005): Zeitüberschreitung abgelaufen. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext-Kontext, HttpApplication-App) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpC
. InitSpecial (Httpapplicationstate - Zustand, Method [] Lader, IntPtr appContext, Httpcontext context) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, Httpcontext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375[HttpException (0x80004005): Zeitüberschreitung abgelaufen. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext-Kontext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext-Kontext) +141 System.Web.HttpRuntime.ProcessRequestNr
EDIT NACH ANTWORTEN:
meine Application_Start
in Global.asax
ist wie folgt:
protected void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
OnlineUsers.Update_SessionEnd_And_Online(
DateTime.Now,
false);
AddTask("DoStuff", 10);
}
Die gespeicherte Prozedur, die aufgerufen wird, lautet:
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
Ich habe zwei Methoden, um Online-Benutzer zu erhalten:
- mit
Application["OnlineUsers"] = 0;
- der andere benutzt die Datenbank
Für Methode 2 habe ich alle OnlineUsers auf zurückgesetzt Application_Start
. Diese Tabelle enthält über 482.751 Datensätze.
quelle
Antworten:
Sieht so aus, als hätten Sie eine Abfrage, die länger dauert als sie sollte. Anhand Ihrer Stapelverfolgung und Ihres Codes sollten Sie genau bestimmen können, um welche Abfrage es sich handelt.
Diese Art der Zeitüberschreitung kann drei Ursachen haben.
Es kann schwierig sein, einen Deadlock zu beheben, aber es ist leicht festzustellen, ob dies der Fall ist. Stellen Sie mit SQL Server Management Studio eine Verbindung zu Ihrer Datenbank her. Klicken Sie im linken Bereich mit der rechten Maustaste auf den Serverknoten und wählen Sie Aktivitätsmonitor . Schauen Sie sich die laufenden Prozesse an. Normalerweise sind die meisten im Leerlauf oder laufen. Wenn das Problem auftritt, können Sie jeden blockierten Prozess anhand des Prozessstatus identifizieren. Wenn Sie mit der rechten Maustaste auf den Prozess klicken und Details auswählen , wird die zuletzt vom Prozess ausgeführte Abfrage angezeigt.
Das zweite Problem führt dazu, dass die Datenbank einen nicht optimalen Abfrageplan verwendet. Es kann durch Löschen der Statistiken behoben werden:
Wenn das nicht funktioniert, können Sie es auch versuchen
Sie sollten dies nicht tun, wenn Ihr Server stark ausgelastet ist, da er vorübergehend einen großen Leistungseinbruch erleidet, da alle gespeicherten Prozesse und Abfragen bei der ersten Ausführung neu kompiliert werden. Da Sie jedoch angeben , dass das Problem manchmal auftritt und der Stack-Trace anzeigt, dass Ihre Anwendung gestartet wird, führen Sie wahrscheinlich eine Abfrage aus, die nur gelegentlich ausgeführt wird. Sie sind möglicherweise besser dran, wenn Sie SQL Server zwingen, einen vorherigen Abfrageplan nicht wiederzuverwenden. In dieser Antwort finden Sie Einzelheiten dazu.
Ich habe bereits das dritte Problem angesprochen, aber Sie können leicht feststellen, ob die Abfrage optimiert werden muss, indem Sie die Abfrage manuell ausführen, z. B. mit SQL Server Management Studio. Wenn die Abfrage zu lange dauert, müssen Sie sie wahrscheinlich auch nach dem Zurücksetzen der Statistiken optimieren. Um dabei zu helfen, sollten Sie die genaue Abfrage in einer neuen Frage veröffentlichen.
quelle
exec sp_updatestats
mein Problem gelöst. Danke vielmals!In Ihrem Code, in dem Sie die gespeicherte Prozedur ausführen, sollten Sie Folgendes haben:
Fügen Sie eine solche Codezeile hinzu:
Dies wartet so lange wie nötig, bis der Vorgang abgeschlossen ist.
quelle
Sie können die
CommandTimeout
Eigenschaft des SQL-Befehls so festlegen , dass die lange laufende SQL-Transaktion berücksichtigt wird.Möglicherweise müssen Sie sich auch die SQL-Abfrage ansehen, die das Zeitlimit verursacht.
quelle
Alle früheren Antworten betrafen zwar das Problem, deckten jedoch nicht alle Fälle ab.
Microsoft hat das Problem erkannt und 2011 für unterstützte Betriebssysteme behoben. Wenn Sie also den Stack-Trace wie folgt erhalten:
Möglicherweise müssen Sie Ihre .NET-Assemblys aktualisieren.
Siehe KB 2605597 für Details
https://support.microsoft.com/kb/2605597
quelle
Vielleicht ist es für jemanden nützlich. Ich hatte das gleiche Problem und in meinem Fall war der Grund dafür, dass die SqlConnection geöffnet und nicht in der Methode entsorgt wurde, die ich in einer Schleife mit etwa 2500 Iterationen aufgerufen habe. Der Verbindungspool war erschöpft. Die richtige Entsorgung löste das Problem.
quelle
using
Blöcke zu verwenden) habe ich dieses Timeout-Problem. Dies schien es zu lösen.Ich hatte das gleiche Problem, als ich ungefähr 3 Tage daran arbeitete. Mir ist aufgefallen, dass unsere Anzahl der Datensätze nicht sehr hoch ist. Unser leitender Entwickler speichert 2 Bilder und Fingerabdrücke in der Datenbank. Wenn ich versuche, diese Hex-Werte abzurufen, dauert es sehr lange, bis die durchschnittliche Zeit für die Ausführung meiner Prozedur etwa 38 Sekunden beträgt. Das Standard-Befehlszeitlimit beträgt 30 Sekunden, sodass weniger als die durchschnittliche Zeit zum Ausführen meiner gespeicherten Prozedur erforderlich ist. Ich stelle mein Befehlszeitlimit wie unten ein
und es funktioniert gut, aber manchmal, wenn Ihre Abfrage länger als 50 Sekunden dauert, wird der gleiche Fehler angezeigt.
quelle
Sie müssen das CommandTimeout-Attribut festlegen. Sie können das CommandTimeout-Attribut in der untergeordneten Klasse DbContext festlegen.
quelle
Ich bin kürzlich auf diesen Fehler gestoßen und habe nach einer kurzen Untersuchung festgestellt, dass der Speicherplatz auf der Festplatte mit der Datenbank (weniger als 1 GB) nicht mehr ausreicht.
Sobald ich die Datenbankdateien (.mdf und .ldf) auf eine andere Festplatte auf demselben Server (mit viel mehr Speicherplatz) verschoben habe, wurde dieselbe Seite (die die Abfrage ausführt), deren Zeitüberschreitung abgelaufen war, innerhalb von drei Sekunden geladen.
Eine andere Sache, die untersucht werden muss, um diesen Fehler zu beheben, ist die Größe der Datenbankprotokolldateien. Ihre Protokolldateien müssen möglicherweise verkleinert werden.
quelle
Ich habe ein Problem mit großen Berechnungen in sp_foo, die viel Zeit in Anspruch nehmen, also habe ich
mit diesem kleinen Bitcode behoben
quelle
Das Standardzeitlimit beträgt 15 Sekunden. Um dies zu ändern, ist 0 unbegrenzt, jede andere Zahl ist die Anzahl der Sekunden.
In Code
In Ihrer Web.Config ist "Command Timeout = 0;" Keine Zeitüberschreitung oder weniger als 1 Stunde (3600 Sekunden)
quelle
@SilverLight .. Dies ist eindeutig ein Problem mit einem Datenbankobjekt. Es kann sich um eine schlecht geschriebene Abfrage oder um fehlende Indizes handeln. Ab sofort empfehle ich Ihnen jedoch nicht, das Zeitlimit zu erhöhen, ohne das Problem mit Ihren Datenbankobjekten zu untersuchen
Setzen Sie einen Haltepunkt in diese Codezeile, um den Prozedurnamen herauszufinden, und optimieren Sie die Prozedur anhand des Ausführungsplans.
Ich kann Ihnen nicht mehr helfen, bis Sie Details über die gespeicherte Prozedur veröffentlichen.
quelle
Versuchen
Erstellen Sie dann Ihren Index neu
quelle
quelle
TLDR :
Ich bin aus verschiedenen Gründen häufig auf diesen Fehler gestoßen und hatte verschiedene Lösungen, darunter:
quelle
Stellen Sie außerdem sicher, dass keine Transaktion aussteht. :) :)
Ich habe einige Tests durchgeführt und eine Transaktion begonnen, um sicher zu gehen, sie aber nie abgeschlossen. Ich wünschte, der Fehler wäre expliziter gewesen, aber na ja!
quelle
Wir hatten schwere Zeiten
Timeout expired/max pool reached
Sqlexception
. Um dies zu umgehen und um einen Neustart des Servers oder des Dienstes zu verhindern, ändern wir dieMAX SERVER MEMORY
Variable in SQL Server (entweder über SQL Managment Studio oder T-SQL):Dies behebt das Problem vorübergehend, bis es erneut auftritt. In unserem Fall vermuten wir, dass es sich um Verbindungslecks auf App-Ebene handelt.
quelle
Wir haben kürzlich ein Upgrade auf die NuGet-Version von
SqlClient
(Microsoft.Data.SqlClient
) durchgeführt, die einen Fehler enthält . Dieser Fehler wurde während der Lebensdauer des 1.x-Zyklus eingeführt und wurde bereits behoben. Das Update wird in der Version 2.0.0 verfügbar sein, die zum Zeitpunkt dieses Schreibens nicht verfügbar ist. Eine Vorschau ist verfügbar.Sie können die Details hier einsehen : https://github.com/dotnet/SqlClient/issues/262
quelle