Zeitüberschreitung. Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Die Anweisung wurde beendet

296

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_Startin Global.asaxist 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:

  1. mit Application["OnlineUsers"] = 0;
  2. 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.

SilverLight
quelle
1
Wie hier steht Standard ist 15 Sekunden
V4Vendetta
1
Besser, um eine Ursachenanalyse durchzuführen. Es gibt verschiedene Gründe, um ein solches Problem zu verursachen. Am grundlegendsten ist die komplexe Struktur der Abfrage. Ich hatte das gleiche Problem, als ich Bilder abrief, die als Hex-Werte in der Tabelle gespeichert waren.
Vijay Kumbhoje
Abgesehen von den oben genannten Ursachen füge ich noch eine hinzu: Sperrzeitlimit : docs.microsoft.com/en-us/sql/t-sql/statements/… Wenn dieser Thread zu lange auf die Sperre wartet, wird das Zeitlimit basierend auf über Dokument.
Herbert Yu

Antworten:

344

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.

  1. Irgendwo gibt es eine Sackgasse
  2. Die Statistiken und / oder der Abfrageplan-Cache der Datenbank sind falsch
  3. Die Abfrage ist zu komplex und muss optimiert werden

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:

exec sp_updatestats

Wenn das nicht funktioniert, können Sie es auch versuchen

dbcc freeproccache

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.

Marnix van Valen
quelle
39
Ich hatte den gleichen Fehler, aber in einer Abfrage, die 'nur' 8 Sekunden dauerte ... und Ihr Tipp über das hat exec sp_updatestatsmein Problem gelöst. Danke vielmals!
Nrod
2
Das Lösen eines solchen Problems ist fast nie eine Frage der Optimierung von Zeitüberschreitungen oder der Größe des Verbindungspools. Sie müssen eintauchen und die Grundursache herausfinden. Wenn Sie Hilfe bei der Lösung dieser Grundursache benötigen, können Sie Ihre eigene Frage stellen.
Marnix van Valen
5
Dies ist sicherlich kein Deadlock. Es kann durch übermäßiges Blockieren verursacht werden, aber Deadlocks werden in einer Sekunde behoben und erzeugen unterschiedliche Fehler. Dies kann eine übermäßige Blockierung sein, ist jedoch kein Deadlock.
Michael J Swart
1
Sind wir sicher, dass dies ein Befehlszeitlimit und kein Verbindungszeitlimit ist? "System.Data.SqlClient.SqlConnection.OnError" weist für mich auf ein Verbindungsproblem hin.
Mike W
1
@PrashantPimpale Es kommt darauf an Wenn Sie ein ernstes Problem in der Produktion haben, bei dem falsche Statistiken zu schlechten Ausführungsplänen führen, könnte dies eine Lösung sein. Abgesehen von außergewöhnlichen Problemen (wie Hardwarefehlern) wird durch das Aktualisieren von Statistiken Ihre Datenbank nicht beschädigt. Dies kann für einige Zeit zu langsameren Abfragen führen. Am Ende ist es jedoch Ihr Anruf.
Marnix van Valen
155

In Ihrem Code, in dem Sie die gespeicherte Prozedur ausführen, sollten Sie Folgendes haben:

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

Fügen Sie eine solche Codezeile hinzu:

c.CommandTimeout = 0;

Dies wartet so lange wie nötig, bis der Vorgang abgeschlossen ist.

Elastep
quelle
143
Sie sollten sich auch darüber im Klaren sein, dass der Wert 0 nicht empfohlen wird : Ein Wert von 0 gibt keine Begrenzung an und sollte in einem CommandTimeout vermieden werden, da ein Versuch, einen Befehl auszuführen, unbegrenzt warten wird. Es ist besser zu lernen, wie viel Zeit der Befehl benötigt, und den Timeout-Wert bei Bedarf zu erhöhen.
Otiel
7
Ich stimme Otiel zu und habe Ihre Antwort abgelehnt: Wenn Sie den Befehl timeout auf 0 setzen, geben Sie dem Webserver keine Chance, sich von einem Datenbankserver zu erholen, der nicht antwortet. Zweitens sollten Sie beim Erreichen des Standardzeitlimits in Betracht ziehen, die Ursache zu untersuchen. In den meisten Fällen ist es besser, die Abfrage zu korrigieren, als die Zeitüberschreitung zu erhöhen.
Maarten Kieft
10
Ich würde nicht in die Falle tappen, es nicht zu empfehlen. Es war sehr nützlich für mich und meine täglich geplanten Aufgaben: Eine unendliche Zeitüberschreitung verhindert nicht, dass ein Prozess abgeschlossen wird und ein Fehler zurückgegeben wird, wenn etwas schief geht. Einfach ausgedrückt, können Sie nur zulassen, dass eine Abfrage jederzeit beendet wird, ohne dass Sie später Probleme haben, da Sie nicht genügend Zeit für den Abschluss des Vorgangs zugewiesen haben. Sie können auch vermeiden, Ihr Programm durch Multithreading zu blockieren.
WonderWorker
2
Ja, bei großen Datenübertragungen ist dies nicht sinnvoll. Wenn Sie Millionen von Zeilen übertragen, ist das, was Otiel und BlackHawkDesign sagen, nicht sinnvoll.
Bluerubez
In 20 Jahren datenzentrierter Entwicklung musste ich das nie tun. Es gibt fast immer eine einigermaßen einfache Lösung, die eine bessere Leistung bietet und nicht die Möglichkeit bietet, dass ein einzelner Prozess den ganzen Tag in einer Datenbank arbeitet. Die überwiegende Mehrheit der DB-Leistungsprobleme kann so eingestellt werden, dass sie mehrere Größenordnungen schneller ausgeführt werden. Das heißt, dieser Vorgang, auf den Sie 3 Stunden warten, könnte wahrscheinlich auf 3 Minuten oder sogar 3 Sekunden eingestellt werden.
b_levitt
25

Sie können die CommandTimeoutEigenschaft 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.

Kev Ritchie
quelle
Hallo, "oder Sie müssen sich die SQL-Abfrage ansehen, die das Zeitlimit verursacht" -> in SQL Server 2008, wo soll ich nach diesem Zeitlimit suchen?
SilverLight
Möglicherweise müssen Sie die gespeicherte Prozedur testen, die von DataLayer.OnlineUsers.Update_SessionEnd_And_Online aufgerufen wird, da die Stapelverfolgung darauf hinzuweisen scheint. Nehmen Sie eine Kopie der Live-Datenbank in den Test und führen Sie die gespeicherte Prozedur aus, indem Sie die erforderlichen Parameter übergeben. Wenn der Vorgang länger als 30 Sekunden dauert, erhalten Sie eine Auszeit. Ich gehe davon aus, dass Sie Zugriff auf SQL Server Management Studio haben.
Kev Ritchie
Ja, ich habe Zugriff auf SQL Server 2008. Ich sollte Ihren Weg versuchen.
SilverLight
Wenn Sie die gespeicherte Prozedur finden, die das Problem verursacht, können Sie die in der gespeicherten Prozedur enthaltene Abfrage über den Database Tuning Adviser ausführen,
Kev Ritchie
12

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:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

Möglicherweise müssen Sie Ihre .NET-Assemblys aktualisieren.

Dieses Problem tritt aufgrund eines Fehlers im Verbindungswiederholungsalgorithmus für gespiegelte Datenbanken auf.

Wenn der Wiederholungsalgorithmus verwendet wird, wartet der Datenprovider, bis der erste Leseaufruf (SniReadSync) abgeschlossen ist. Der Anruf wird an den Back-End-Computer gesendet, auf dem SQL Server ausgeführt wird, und die Wartezeit wird berechnet, indem der Wert für das Verbindungszeitlimit mit 0,08 multipliziert wird. Der Datenprovider setzt jedoch fälschlicherweise eine Verbindung in einen zum Scheitern verurteilten Zustand, wenn eine Antwort langsam ist und der erste SniReadSync-Aufruf nicht vor Ablauf der Wartezeit abgeschlossen wird.

Siehe KB 2605597 für Details

https://support.microsoft.com/kb/2605597

Matcheek
quelle
9

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.

Ewigkeit
quelle
Dies! genau das. Mein Problem war, dass ich Methoden in einem anderen Thread ausgelöst habe, ohne darauf zu warten (da der Benutzer kein Ergebnis dieser Methode, Hintergrundskript, benötigt). Ohne zu entsorgen ( usingBlöcke zu verwenden) habe ich dieses Timeout-Problem. Dies schien es zu lösen.
CularBytes
Haben Sie den Timeout-Fehler erhalten, wenn der maximale Verbindungspool erreicht wurde oder das Timeout abgelaufen ist? Die Zeitspanne, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert. Wenn Sie den maximal erreichten Pool erhalten, ist es sinnvoll, nach einer durchgesickerten Verbindung zu suchen. Aber ich bekomme Server nicht Antwort Fehler.
Jeeva Subburaj
8

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

cmd.CommandTimeout = 50

und es funktioniert gut, aber manchmal, wenn Ihre Abfrage länger als 50 Sekunden dauert, wird der gleiche Fehler angezeigt.

Vijay Kumbhoje
quelle
8

Sie müssen das CommandTimeout-Attribut festlegen. Sie können das CommandTimeout-Attribut in der untergeordneten Klasse DbContext festlegen.

public partial class StudentDatabaseEntities : DbContext
{
    public StudentDatabaseEntities()
        : base("name=StudentDatabaseEntities")
    {
        this.Database.CommandTimeout = 180;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<StudentDbTable> StudentDbTables { get; set; }
}
Siddarth Kanted
quelle
4

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.

Hafiz Adewuyi
quelle
3

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

public partial class FooEntities : DbContext
{
   public FooEntities()
         : base("name=FooEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // Sets the command timeout for all the commands
        objectContext.CommandTimeout = 380;
    }
Nabeel Iqbal
quelle
3

Das Standardzeitlimit beträgt 15 Sekunden. Um dies zu ändern, ist 0 unbegrenzt, jede andere Zahl ist die Anzahl der Sekunden.

In Code

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

In Ihrer Web.Config ist "Command Timeout = 0;" Keine Zeitüberschreitung oder weniger als 1 Stunde (3600 Sekunden)

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />
David C Fuchs
quelle
2
Das sind zwei verschiedene Zeitüberschreitungen. Ihr erster Vorschlag befasst sich mit der Frage. Ihr zweiter würde nur funktionieren, wenn der Verbindungsanbieter ihn unterstützt, was SqlClient nicht tut. In jedem Fall ist eine Zeitüberschreitung von 0 in der Produktion niemals eine gute Idee. 30 Sekunden ist die übliche Standardeinstellung.
Suncat2000
2

@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

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

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.

Amit Rai Sharma
quelle
Gespeicherte Prozedur macht keine ausgefallenen Sachen. Es scheint jedoch, dass die OnlineUsers-Tabelle gesperrt ist, während die Prozedur ausgeführt wird. Versuchen Sie SQL Profiler, um zu sehen, was bei Application_Start
Amit Rai Sharma
2

Versuchen

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

Erstellen Sie dann Ihren Index neu

maksoud
quelle
8
Können Sie Ihre Lösung erklären?
Hp93
0

Das Zeitlimit ist abgelaufen, da die SQL-Abfrage mehr Zeit in Anspruch nimmt, als Sie in der Eigenschaft sqlCommand.CommandTimeout festgelegt haben.

Natürlich können Sie CommandTimeout erhöhen, um dieses Problem zu beheben, aber bevor Sie dies tun, müssen Sie Ihre Abfrage durch Hinzufügen eines Index optimieren. Wenn Sie Ihre Abfrage in ausführen SQL Server Management Studio einschließlich tatsächlichen Ausführungsplan dann SQL Server Management Studio werden Sie richtigen Index vorschlagen. In den meisten Fällen werden Sie Timeout-Probleme beseitigen, wenn Sie Ihre Abfrage optimieren können.

Khabir
quelle
0

TLDR :

  1. Der Neustart von Anwendungs- und DB-Servern ist die schnellste Lösung, bei der sich Datenvolumen, Netzwerkeinstellungen und Code nicht geändert haben. Das machen wir in der Regel immer
  2. Kann ein Indikator für einen Ausfall der Festplatte sein, die ausgetauscht werden muss - überprüfen Sie die Systembenachrichtigungen

Ich bin aus verschiedenen Gründen häufig auf diesen Fehler gestoßen und hatte verschiedene Lösungen, darunter:

  1. Refactoring meines Codes, um SqlBulkCopy zu verwenden
  2. Erhöhen der Timeout-Werte, wie in verschiedenen Antworten angegeben, oder Überprüfen auf zugrunde liegende Ursachen ( möglicherweise nicht datenbezogen )
  3. Verbindungszeitlimit (Standard 15s) - Wie lange es dauert, bis eine Verbindung zum SQL Server hergestellt ist, bevor sie beendet wird - TCP / PORT-bezogen - kann eine Checkliste zur Fehlerbehebung durchlaufen (sehr praktischer MSDN-Artikel)
  4. Befehlszeitlimit (Standard 30s) - Wie lange es dauert, auf die Ausführung einer Abfrage zu warten - Abfrageausführung / Netzwerkverkehr - hat auch einen Fehlerbehebungsprozess (ein weiterer sehr praktischer MSDN-Artikel)
  5. Neustart der Server - sowohl der Anwendung als auch des DB-Servers (falls getrennt) - wo sich Code und Daten nicht geändert haben, muss sich die Umgebung geändert haben - Als erstes müssen Sie dies tun. Wird normalerweise durch Patches (Betriebssystem, .NET Framework- oder SQL Server-Patches oder -Updates) verursacht. Insbesondere, wenn die Timeout-Ausnahme wie folgt angezeigt wird (auch wenn wir Azure nicht verwenden):
    • System.Data.Entity.Core.EntityException: Es wurde eine Ausnahme ausgelöst, die wahrscheinlich auf einen vorübergehenden Fehler zurückzuführen ist. Wenn Sie eine Verbindung zu einer SQL Azure-Datenbank herstellen, sollten Sie SqlAzureExecutionStrategy verwenden. ---> System.Data.Entity.Core.EntityCommandExecutionException: Beim Ausführen der Befehlsdefinition ist ein Fehler aufgetreten. Einzelheiten finden Sie in der inneren Ausnahme. ---> System.Data.SqlClient.SqlException: Beim Empfang der Ergebnisse vom Server ist ein Fehler auf Transportebene aufgetreten. (Anbieter: TCP-Anbieter, Fehler: 0 - Das Zeitlimit für das Semaphor ist abgelaufen.) ---> System.ComponentModel.Win32Exception: Das Zeitlimit für das Semaphor ist abgelaufen
user919426
quelle
0

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!

jeromej
quelle
0

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 die MAX SERVER MEMORYVariable in SQL Server (entweder über SQL Managment Studio oder T-SQL):

DECLARE @maxMem INT = 3000 --Max. memory for SQL Server instance in MB
EXEC sp_configure 'show advanced options', 1
RECONFIGURE

Dies behebt das Problem vorübergehend, bis es erneut auftritt. In unserem Fall vermuten wir, dass es sich um Verbindungslecks auf App-Ebene handelt.

Santiago beendet SO
quelle
0

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

Noel Widmer
quelle