Timeout abgelaufene Nachrichten beim Herstellen einer Verbindung mit SQL Server
Gilt für: SQL Server
Notiz
Bevor Sie mit der Problembehandlung beginnen, überprüfen Sie die Voraussetzungen , und durchlaufen Sie die Checkliste.
Ein Timeoutfehler bedeutet, dass ein bestimmter Vorgang länger dauert als erforderlich. Die Clientanwendung beendet den Vorgang (anstatt auf unbestimmte Zeit zu warten), wodurch andere Vorgänge blockiert und eine Anwendung angehalten werden kann. Dieser Artikel enthält Lösungen für Fehler "Command-timeout" und "connection-timeout", die beim Herstellen einer Verbindung mit SQL Server angezeigt werden.
Überprüfen abgelaufener Timeoutfehler
Wenn Probleme mit "Timeout abgelaufen" auftreten, erhalten Sie eine oder mehrere der folgenden Fehlermeldungen:
-
Timeout ist abgelaufen. Das Timeout ist vor dem Beenden des Vorgangs eingetreten, oder der Server reagiert nicht.
-
System.Data.SqlClient.SqlException (0x80131904): Verbindungstimeout abgelaufen. Das Zeitlimit ist während des Versuchs verstrichen, die Handshakebestätigung vor der Anmeldung zu verarbeiten. Dies kann daran liegen, dass beim Handshake vor der Anmeldung ein Fehler aufgetreten ist oder der Server nicht rechtzeitig reagieren konnte. Die Dauer des Verbindungsversuchs zu diesem Server war [Pre-Login] initialization=23; handshake=14979;
System.ComponentModel.Win32Exception (0x80004005): Die Warteoperation wurde abgebrochen. -
System.Data.SqlClient.SqlException (0x80131904): Timeout abgelaufen. Das Timeout ist vor dem Beenden des Vorgangs eingetreten, oder der Server reagiert nicht. System.ComponentModel.Win32Exception (0x80004005): Die Warteoperation wurde abgebrochen.
-
Verbindungstimeoutfehler. Das Zeitlimit ist während des Versuchs verstrichen, die Handshakebestätigung vor der Anmeldung zu verarbeiten. Dies kann daran liegen, dass beim Handshake vor der Anmeldung ein Fehler aufgetreten ist oder der Server nicht rechtzeitig reagieren konnte.
Die Dauer, die beim Versuch, eine Verbindung mit diesem Server herzustellen, war [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Fehler: -2). -
System.InvalidOperationException: Timeout abgelaufen. Die Timeout-Periode, die verstrichen ist, bevor eine Verbindung aus dem Pool hergestellt werden konnte.
Wenn Verbindungen nicht ordnungsgemäß geschlossen werden, können Fehler auftreten. Diese Fehler treten auf, da alle poolgebundenen Verbindungen verwendet werden und die maximale Poolgröße erreicht ist. Sie können diese Fehler vermeiden, wenn Sie die im Artikel "Verbindungspool " beschriebenen Schritte ausführen.
Notiz
Der zweite und der dritte Fehler treten auf, wenn .NET Framework 4.5 oder eine höhere Version installiert wird.
Ermitteln des Typs abgelaufener Timeoutfehler
Aus Konnektivitätsperspektive treten die folgenden Timeoutprobleme auf:
- Verbindungstimeout (standardmäßig 15 Sekunden)
- Abfrage- oder Befehlstimeout (standardmäßig 30 Sekunden)
Notiz
Die Standardwerte können über Code, verbindende Zeichenfolge oder andere Methoden festgelegt werden.
Zeigen Sie vor der Problembehandlung den vollständigen Aufrufstapel der Fehlermeldungen an, um den Fehlertyp zu ermitteln.
Sehen Sie sich das folgende Beispiel für einen Aufrufstapel eines Verbindungstimeouts an:
System.Data.SqlClient.SqlException: 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(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable) at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open()
SqlConnection.Open
gibt an, dass der Client versucht, eine Verbindung zu öffnen und daher nicht mit einer Abfrage verknüpft ist.Sehen Sie sich das folgende Beispiel für einen Aufrufstapel einer Abfrage oder eines Befehlstimeouts an:
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteScalar()
Die
SqlCommand
Klasse wird verwendet, um mit einer Abfrage zu arbeiten, nicht mit einer Verbindung. DieExecuteScalar
Methode wird verwendet, um eine Abfrage auszuführen. Sie können auch andere Elemente sehen, z. B. einExecuteReader
oderExecuteNonQuery
.
Problembehandlung bei abgelaufenen Timeoutfehlern
Wenn ein Abfrage- oder Befehlstimeoutfehler auftritt, lesen Sie die Problembehandlung von Abfragetimeoutfehlern.
Wenn ein Verbindungstimeoutfehler auftritt, führen Sie die folgenden Schritte aus:
Erhöhen Sie den Verbindungstimeoutparameter.
Wenn Sie eine Anwendung zum Herstellen einer Verbindung mit SQL Server verwenden, erhöhen Sie die relevanten Verbindungstimeoutparameterwerte, und überprüfen Sie, ob die Verbindung erfolgreich ist. Wenn Sie beispielsweise verwenden
System.Data.SqlClient
, legen Sie die SqlConnection.ConnectionTimeout-Eigenschaft auf 30 oder einen höheren Wert fest.Notiz
Wenn Sie andere Anbieter verwenden, überprüfen Sie die Homepage für die SQL-Clientprogrammierung.
Wenn Sie SQL Server Management Studio (SSMS) verwenden, wählen Sie im Dialogfeld "Verbindung mit Server verbinden" die Registerkarte "Verbindungseigenschaften" aus, und legen Sie die Einstellung "Verbindungstimeout" auf einen höheren Wert fest.
Wenn die Verbindung erfolgreich ist, handelt es sich um ein Netzwerkproblem. Sie müssen mit Ihrem Netzwerkadministrator zusammenarbeiten, um das Problem zu beheben. Nachdem sie aufgelöst wurde, können Sie zu den Standardeinstellungen in Ihrer Anwendung zurückkehren.
Notiz
Das Erhöhen des Verbindungstimeouts in der Anwendung ist eine mögliche Methode, aber es ist keine langfristige Auflösung. Dies liegt daran, dass die Verbindung schnell (in der Regel innerhalb weniger Millisekunden) erfolgt, wenn Sie versuchen, eine Verbindung mit einer Datenquelle herzustellen.
Typische Ursachen und Lösungen für den Fehler
In der folgenden Tabelle sind typische Ursachen und Auflösungen für abgelaufene Timeoutfehler aufgeführt. Weitere Tipps und Vorschläge finden Sie unter Problembehandlung: Timeout abgelaufen.
Typische Ursachen | Auflösungen |
---|---|
Der Servername wurde falsch eingegeben. | Versuchen Sie es erneut mit dem richtigen Servernamen. |
Der SQL Server-Dienst auf dem Server wird nicht ausgeführt. | Starten Sie die Instanz des SQL Server-Datenbank-Engine. |
Der TCP/IP-Port für die Datenbank-Engine Instanz wird durch eine Firewall blockiert. | Konfigurieren Sie die Firewall, um den Zugriff auf die Datenbank-Engine zu ermöglichen. |
Die Datenbank-Engine lauscht nicht auf Port 1433. Dies liegt daran, dass der Port geändert wird oder nicht die Standardinstanz und der SQL Server-Browserdienst nicht ausgeführt wird. | Starten Sie den SQL Server-Browserdienst, oder geben Sie eine TCP/IP-Portnummer an, um eine Verbindung mit dem Sqlcmd -S <ip_addres>,<port> Befehl herzustellen. Suchen Sie im Fehlerprotokoll die Portnummer, auf die SQL Server lauscht. |
Der SQL Server-Browserdienst wird ausgeführt, aber UDP-Port 1434 wird durch eine Firewall blockiert. | Konfigurieren Sie die Firewall so, dass der Zugriff auf UPD-Port 1434 auf dem Server möglich ist, oder geben Sie die TCP/IP-Portnummer an, um eine Verbindung herzustellen. |
Der Client und der Server sind nicht für die Verwendung desselben Netzwerkprotokolls konfiguriert. | Stellen Sie sicher, dass die Server- und Clientcomputer über mindestens ein aktiviertes Protokoll verfügen, indem Sie SQL Server-Konfigurations-Manager verwenden. Wenn beispielsweise der Client eine Verbindung über TCP/IP-Sockets herstellt, SQL Server jedoch nur benannte Pipes überwacht, kann keine Verbindung hergestellt werden. |
Das Netzwerk kann den Servernamen nicht in eine IP-Adresse auflösen. Dies kann mithilfe der Ping- oder Telnet-Programme getestet werden. | Beheben Sie das Problem mit der Computernamenauflösung in Ihrem Netzwerk, oder stellen Sie mithilfe der IP-Adresse eine Verbindung mit dem Server her. Dies ist kein SQL Server-Problem. Hilfe finden Sie in ihrer Windows-Dokumentation, oder wenden Sie sich an den Netzwerkadministrator. Verwenden Sie den folgenden Befehl, um die Konnektivität zu testen:telnet <ServerName> [<Port>] telnet <IP_Address> <Port> Wenn die Verwendung einer IP-Adresse funktioniert, der Servername aber nicht funktioniert, handelt es sich um ein Problem mit der Namensauflösung. |
Das Netzwerk kann nicht mithilfe der IP-Adresse verbunden werden. Dies kann mithilfe des Programms "ping", "telnet" oder "tracert " getestet werden. | Beheben Sie das TCP/IP-Problem in Ihrem Netzwerk. Dies ist kein SQL Server-Problem. Hilfe finden Sie in ihrer Windows-Dokumentation, oder wenden Sie sich an den Netzwerkadministrator. Weitere Informationen zur problembehebung im Netzwerk finden Sie unter 0300 Intermittierendes oder regelmäßiges Netzwerkproblem. |