Freigeben über


Meldungen über abgelaufenes Timeout beim Herstellen einer Verbindung mit SQL Server

Gilt für: SQL Server

Hinweis

Bevor Sie mit der Problembehandlung beginnen, sollten Sie die Voraussetzungen überprüfen und die Checkliste durchgehen.

Ein Timeoutfehler bedeutet, dass ein bestimmter Vorgang länger dauert als erforderlich. Die Clientanwendung beendet den Vorgang (anstatt unbegrenzt zu warten), wodurch andere Vorgänge blockiert und eine Anwendung angehalten werden kann. Dieser Artikel enthält Lösungen für „Befehlstimeout“- und „Verbindungstimeout“-Fehler, die beim Herstellen einer Verbindung mit SQL Server auftreten.

Überprüfen von Fehlern wegen abgelaufenem Timeout

Wenn Sie auf Probleme vom Typ „Timeout abgelaufen“ stoßen, erhalten Sie eine oder mehrere der folgenden Fehlermeldungen:

  • Das Timeout ist abgelaufen. The timeout period elapsed prior to completion of the operation or the server is not responding.

  • System.Data.SqlClient.SqlException (0x80131904): Verbindungstimeout abgelaufen. Der Timeoutzeitraum, der beim Versuch verstrichen ist, die Handshake-Bestätigung vor der Anmeldung zu erhalten. Dies kann darauf zurückzuführen sein, dass der Handshake vor der Anmeldung fehlgeschlagen ist oder der Server nicht rechtzeitig reagieren konnte. Die Dauer, die beim Versuch, eine Verbindung mit diesem Server herzustellen, aufgewendet wurde, war [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): Timeout des Wartezeitvorgangs.

  • System.Data.SqlClient.SqlException (0x80131904): Timeout abgelaufen. The timeout period elapsed prior to completion of the operation or the server is not responding. System.ComponentModel.Win32Exception (0x80004005): Timeout des Wartezeitvorgangs.

  • Verbindungstimeout abgelaufen Der Timeoutzeitraum, der beim Versuch verstrichen ist, die Handshake-Bestätigung vor der Anmeldung zu erhalten. Dies kann darauf zurückzuführen sein, dass der Handshake vor der Anmeldung fehlgeschlagen ist oder der Server nicht rechtzeitig reagieren konnte.
    Die Dauer, die beim Versuch, eine Verbindung mit diesem Server herzustellen, aufgewendet wurde, war [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Fehler: -2).

  • System.InvalidOperationException: Timeout abgelaufen Der Timeoutzeitraum, der vor dem Abrufen einer Verbindung aus dem Pool verstrichen ist.

    Wenn Verbindungen nicht ordnungsgemäß geschlossen werden, können Fehler auftreten. Diese Fehler treten auf, weil alle poolierten Verbindungen verwendet werden und die maximale Poolgröße erreicht wird. Sie können diese Fehler vermeiden, wenn Sie die Im Artikel Verbindungspool erschöpft beschriebenen Schritte ausführen.

Hinweis

Der zweite und der dritte Fehler treten auf, wenn .NET Framework Version 4.5 oder höher installiert ist.

Bestimmen der Art des Fehlers bei abgelaufenem Timeout

Aus der Konnektivitätsperspektive treten die folgenden Timeoutprobleme auf:

  • Verbindungstimeout (standardmäßig 15 Sekunden)
  • Abfrage- oder Befehlstimeout (standardmäßig 30 Sekunden)

Hinweis

Die Standardwerte können über Code, eine Verbindungszeichenfolge oder andere Methoden festgelegt werden.

Sehen Sie sich 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 und nicht mit einer Verbindung zu arbeiten. Die ExecuteScalar-Methode wird verwendet, um eine Abfrage auszuführen. Sie können auch andere Elemente sehen, z. B. ein ExecuteReader oder ExecuteNonQuery.

Problembehandlung bei Fehlers wegen abgelaufenem Timeout

  • Wenn ein Abfrage- oder Befehlstimeoutfehler auftritt, finden Sie Informationen unter Problembehandlung bei Abfragetimeoutfehlern.

  • Wenn ein Verbindungstimeoutfehler auftritt, führen Sie die folgenden Schritte aus:

    1. Erhöhen Sie den Verbindungstimeoutparameter.

      • Wenn Sie eine Anwendung zum Herstellen einer Verbindung mit SQL Server verwenden, erhöhen Sie die relevanten Werte des Verbindungstimeoutparameters, und überprüfen Sie, ob die Verbindung schließlich erfolgreich ist. Wenn Sie beispielsweise System.Data.SqlClient verwenden, legen Sie die Eigenschaft SqlConnection.ConnectionTimeout auf 30 oder einen höheren Wert fest.

        Hinweis

        Wenn Sie andere Anbieter verwenden, besuchen Sie die Homepage für die SQL-Clientprogrammierung.

      • Wenn Sie SQL Server Management Studio (SSMS) verwenden, wählen Sie im Dialogfeld Verbindung mit dem Server herstellen die Registerkarte Verbindungseigenschaften aus, und legen Sie die Einstellung für das Verbindungstimeout auf einen höheren Wert fest.

    2. Wenn die Verbindung letztendlich erfolgreich ist, handelt es sich um ein Netzwerkproblem. Sie müssen mit Ihrem Netzwerkadministrator zusammenarbeiten, um das Problem zu beheben. Nachdem es gelöst wurde, können Sie zu den Standardeinstellungen in Ihrer Anwendung zurückkehren.

      Hinweis

      Das Erhöhen des Verbindungstimeouts in der Anwendung ist eine mögliche Methode, aber es handelt sich nicht um eine 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 Lösungen für Fehler wegen abgelaufenem Timeout aufgeführt. Weitere Tipps und Vorschläge finden Sie unter Problembehandlung: Timeout abgelaufen.

Typische Ursachen Lö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-Datenbankmoduls.
Der TCP/IP-Port für die Datenbankmodulinstanz wird durch eine Firewall blockiert. Konfigurieren Sie die Firewall so, dass der Zugriff auf das Datenbankmodul zulässig ist.
Das Datenbankmodul lauscht nicht auf Port 1433. Dies liegt daran, dass der Port geändert wird, oder dass es nicht die Standardinstanz ist und der SQL Server-Browserdienst nicht ausgeführt wird. Starten Sie den SQL Server-Browserdienst, oder geben Sie mit dem Befehl Sqlcmd -S <ip_addres>,<port> eine TCP/IP-Portnummer für die Verbindung an. Suchen Sie im Fehlerprotokoll die Portnummer, auf die SQL Server lauscht.
Der SQL Server-Browserdienst wird ausgeführt, aber der UDP-Port 1434 wird von einer Firewall blockiert. Konfigurieren Sie die Firewall so, dass der Zugriff auf den UPD-Port 1434 auf dem Server zulässig ist, oder geben Sie die TCP/IP-Portnummer für die Verbindung an.
Client und Server sind nicht für die Verwendung desselben Netzwerkprotokolls konfiguriert. Stellen Sie mithilfe von SQL Server-Konfigurations-Manager sicher, dass die Server- und Clientcomputer über mindestens ein aktiviertes Protokoll verfügen. Wenn der Client beispielsweise eine Verbindung über TCP/IP-Sockets herstellt, SQL Server aber nur Named Pipes überwacht, kann keine Verbindung hergestellt werden.
Das Netzwerk kann den Servernamen nicht in eine IP-Adresse auflösen. Dies kann mithilfe der Programme Ping oder Telnet getestet werden. Beheben Sie das Problem mit der Computernamensauflösung in Ihrem Netzwerk, oder stellen Sie über die IP-Adresse eine Verbindung mit dem Server her. Dies ist kein Problem von SQL Server. Weitere Informationen finden Sie in der 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, die des Servernamens jedoch nicht funktioniert, handelt es sich um ein Problem mit der Namensauflösung.
Das Netzwerk kann keine Verbindung über die IP-Adresse herstellen. Dies kann mithilfe des Programms Ping, Telnet oder Tracert getestet werden. Beheben Sie das TCP/IP-Problem in Ihrem Netzwerk – dies ist kein Problem von SQL Server. Weitere Informationen finden Sie in der Windows-Dokumentation, oder wenden Sie sich an den Netzwerkadministrator.
Weitere Informationen zur Problembehandlung im Netzwerk finden Sie unter 0300 Intermittierendes oder regelmäßiges Netzwerkproblem.

Siehe auch