Komunikaty "Upłynął limit czasu" podczas nawiązywania połączenia z serwerem SQL

Dotyczy: SQL Server

Uwaga

Przed rozpoczęciem rozwiązywania problemów zalecamy sprawdzenie wymagań wstępnych i listy kontrolnej.

Błąd przekroczenia limitu czasu oznacza, że określona operacja trwa dłużej niż jest to konieczne. Aplikacja kliencka zatrzymuje tę operację (zamiast czekać przez czas nieokreślony), co może blokować inne operacje i zawieszać aplikację. Ten artykuł zawiera rozwiązania dotyczące błędów "przekroczenie limitu czasu polecenia" i "przekroczenia limitu czasu połączenia" podczas nawiązywania połączenia z serwerem SQL.

Weryfikowanie błędów przekroczenia limitu czasu

Podczas napotkania problemów "przekroczenia limitu czasu" wyświetlają się następujące komunikaty o błędach:

  • Limit czasu wygasł. Limit czasu wygasł przed zakończeniem operacji lub serwer nie odpowiada.

  • System.Data.SqlClient.SqlException (0x80131904): Limit czasu połączenia wygasł. Limit czasu upłynął podczas próby skorzystania z potwierdzenia uzgadniania przed logowaniem. Może to być spowodowane tym, że uzgadnianie przed logowaniem nie powiodło się lub serwer nie mógł odpowiedzieć w czasie. Czas trwania próby nawiązania połączenia z tym serwerem to [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): Upłynął limit czasu operacji oczekiwania.

  • System.Data.SqlClient.SqlException (0x80131904): limit czasu wygasł. Limit czasu wygasł przed zakończeniem operacji lub serwer nie odpowiada. System.ComponentModel.Win32Exception (0x80004005): Upłynął limit czasu operacji oczekiwania.

  • Limit czasu połączenia wygasł. Limit czasu upłynął podczas próby skorzystania z potwierdzenia uzgadniania przed logowaniem. Może to być spowodowane tym, że uzgadnianie przed logowaniem nie powiodło się lub serwer nie mógł odpowiedzieć w czasie.
    Czas trwania próby nawiązania połączenia z tym serwerem to [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, błąd: -2).

  • System.InvalidOperationException: limit czasu wygasł. Limit czasu upłynął przed uzyskaniem połączenia z puli.

    Jeśli połączenia nie są poprawnie zamknięte, mogą wystąpić błędy. Te błędy występują, ponieważ wszystkie połączenia w puli są używane i osiągnięto maksymalny rozmiar puli. Te błędy można uniknąć, jeśli wykona się kroki opisane w artykule Wyczerpano pulę połączeń.

Uwaga

Drugi i trzeci błąd występuje w przypadku zainstalowania programu .NET Framework w wersji 4.5 lub nowszej.

Określanie typu błędów przekroczenia limitu czasu

Z perspektywy łączności występują następujące problemy z przekroczeniem limitu czasu:

  • Limit czasu połączenia (domyślnie 15 sekund)
  • Limit czasu zapytania lub polecenia (domyślnie 30 sekund)

Uwaga

Wartości domyślne można ustawić za pomocą kodu, ciągu łączącego lub innych metod.

Przed rozpoczęciem rozwiązywania problemów wyświetl kompletny stos wywołań komunikatów o błędach, aby określić typ błędu.

  • Zobacz następujący przykład stosu wywołań limitu czasu połączenia:

    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()  
    

    Instrukcja SqlConnection.Open wskazuje, że klient próbuje otworzyć połączenie i dlatego nie jest związana z zapytaniem.

  • Zobacz następujący przykład stosu wywołań zapytania lub limitu czasu polecenia:

    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()
    

    Klasa SqlCommand jest używana do pracy z zapytaniem, a nie z połączeniem. Metoda ExecuteScalar jest używana do uruchamiania zapytania. Można również wyświetlić inne elementy, takie jak ExecuteReader lub ExecuteNonQuery.

Rozwiązywanie problemów z błędami przekroczenia limitu czasu

  • Jeśli wystąpi błąd zapytania lub limitu czasu polecenia, zobacz artykuł Rozwiązywanie problemów z błędami przekroczenia limitu czasu zapytania.

  • Jeśli wystąpi błąd przekroczenia limitu czasu połączenia, wykonaj następujące kroki:

    1. Zwiększ parametr limitu czasu połączenia.

      • Jeśli używasz aplikacji do nawiązywania połączenia z serwerem SQL, zwiększ odpowiednie wartości parametrów limitu czasu połączenia i sprawdź, czy połączenie ostatecznie zakończy się pomyślnie. Jeśli na przykład używasz instrukcji System.Data.SqlClient, ustaw właściwość SqlConnection.ConnectionTimeout na wartość 30 lub wyższą.

        Uwaga

        Jeśli używasz innych dostawców, sprawdź stronę główną pod kątem programowania klienta SQL.

      • Jeśli używasz programu SQL Server Management Studio (SSMS), wybierz kartę Właściwości połączenia w oknie dialogowym Łączenie z serwerem i ustaw ustawienie Limit czasu połączenia na wyższą wartość.

    2. Jeśli połączenie ostatecznie zakończy się pomyślnie, oznacza to problem z siecią. Aby rozwiązać ten problem, musisz współpracować z administratorem sieci. Po jego rozwiązaniu można przywrócić ustawienia domyślne w aplikacji.

      Uwaga

      Zwiększenie limitu czasu połączenia w aplikacji jest możliwą metodą, ale nie jest to rozwiązanie długoterminowe. Dzieje się tak, ponieważ połączenie odbywa się szybko (zwykle w ciągu kilku milisekund) podczas próby nawiązania połączenia ze źródłem danych.

Typowe przyczyny i rozwiązania tego błędu

W poniższej tabeli wymieniono typowe przyczyny i rozwiązania błędów przekroczenia limitu czasu. Aby uzyskać więcej wskazówek i sugestii, zobacz artykuł Rozwiązywanie problemów: przekroczenie limitu czasu wygasło.

Typowe przyczyny Rozwiązania
Nazwa serwera została wpisana niepoprawnie. Spróbuj ponownie z poprawną nazwą serwera.
Usługa SQL Server na serwerze nie jest uruchomiona. Uruchom instancję silnika bazy danych SQL Server.
Port TCP/IP dla instancji silnika bazy danych jest zablokowany przez zaporę. Skonfiguruj zaporę, aby zezwolić na dostęp do silnika bazy danych.
Silnik bazy danych nie nasłuchuje na porcie 1433. Dzieje się tak, ponieważ port jest zmieniony, lub nie jest to domyślna instancja i usługa SQL Server Browser nie jest uruchomiona. Uruchom usługę SQL Server Browser lub określ numer portu TCP/IP, aby nawiązać połączenie za pomocą Sqlcmd -S <ip_addres>,<port> polecenia. W dzienniku błędów znajdź numer portu, który nasłuchuje SQL Server.
Usługa SQL Server Browser jest uruchomiona, ale port UDP 1434 jest blokowany przez zaporę. Skonfiguruj zaporę, aby zezwolić na dostęp do portu UPD 1434 na serwerze, lub podaj numer portu TCP/IP w celu nawiązania połączenia.
Klient i serwer nie są skonfigurowane do używania tego samego protokołu sieciowego. Upewnij się, że serwer i komputery klienckie mają co najmniej jeden wspólny protokół z włączoną obsługą przy użyciu SQL Server Configuration Manager. Jeśli na przykład klient łączy się przy użyciu gniazd TCP/IP, ale SQL Server nasłuchuje tylko w potokach nazwanych, nie można nawiązać połączenia.
Sieć nie może rozwiązać nazwy serwera na adres IP — można to sprawdzić za pomocą programów ping lub telnet. Rozwiąż problem z rozpoznawaniem nazw komputera w sieci lub połącz się z serwerem przy użyciu adresu IP — nie jest to problem SQL Server. Aby uzyskać pomoc, zobacz dokumentację systemu Windows lub skontaktuj się z administratorem sieci. Użyj następującego polecenia, aby przetestować łączność:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Jeśli użycie adresu IP działa, ale nazwa serwera nie działa, jest to problem z rozpoznawaniem nazw.
Sieć nie może nawiązać połączenia przy użyciu adresu IP — można to sprawdzić przy użyciu programu ping, telnet lub tracert. Rozwiązano problem z protokołem TCP/IP w sieci — nie jest to problem SQL Server. Aby uzyskać pomoc, zobacz dokumentację systemu Windows lub skontaktuj się z administratorem sieci.
Bardziej zaawansowane rozwiązywanie problemów z siecią można znaleźć w części 0300 Sporadyczny lub okresowy problem z siecią.

Zobacz też