Udostępnij za pośrednictwem


Przekroczenie limitu czasu wygasłych komunikatów podczas nawiązywania połączenia z programem SQL Server

Dotyczy: SQL Server

Uwaga 16.

Przed rozpoczęciem rozwiązywania problemów sprawdź wymagania wstępne i zapoznaj się z listą kontrolną.

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

Sprawdzanie przekroczenia limitu czasu wygasłych błędów

W przypadku wystąpienia problemów z "upłynięciem limitu czasu" zostanie wyświetlony co najmniej jeden z następujących komunikatów o błędach:

  • Upłynął limit czasu. Limit czasu upłynął przed ukończeniem operacji lub serwer nie odpowiada.

  • System.Data.SqlClient.SqlException (0x80131904): Upłynął limit czasu połączenia. Podczas próby wykorzystania potwierdzenia uzgodnienia przed logowaniem upłynął limit czasu. Może to być spowodowane tym, że uzgadnianie przed logowaniem nie powiodło się lub serwer nie mógł odpowiedzieć na czas. Zużycie czasu podczas próby nawiązania połączenia z tym serwerem: [przed logowaniem] inicjowanie=23; uzgadnianie=14979;
    System.ComponentModel.Win32Exception (0x80004005): Upłynął limit czasu operacji oczekiwania.

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

  • Upłynął limit czasu połączenia. Podczas próby wykorzystania potwierdzenia uzgodnienia przed logowaniem upłynął limit czasu. Może to być spowodowane tym, że uzgadnianie przed logowaniem nie powiodło się lub serwer nie mógł odpowiedzieć na czas.
    Czas trwania próby nawiązania połączenia z tym serwerem to [Wstępne logowanie] inicjowanie=21036; uzgadnianie=0; (Microsoft SQL Server, Błąd: -2).

  • System.InvalidOperationException: Upłynął limit czasu. Upłynął limit czasu 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ż są używane wszystkie połączenia w puli i osiągnięto maksymalny rozmiar puli. Te błędy można uniknąć, wykonując kroki opisane w artykule dotyczącym wyczerpanej puli połączeń.

Uwaga 16.

Drugi i trzeci błąd występuje, gdy jest zainstalowany program .NET Framework 4.5 lub nowsza wersja.

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

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 16.

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

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

  • Zobacz następujący przykład stosu wywołań przekroczenia 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()  
    

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

  • Zobacz następujący przykład stosu wywołań zapytania lub przekroczenia 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 służy do pracy z zapytaniem, a nie z połączeniem. Metoda ExecuteScalar służy do uruchamiania zapytania. Można również wyświetlić inne elementy, takie jak lub ExecuteReader ExecuteNonQuery.

Rozwiązywanie problemów z przekroczeniem limitu czasu wygasłych błędów

  • Jeśli wystąpi błąd zapytania lub przekroczenia limitu czasu polecenia, zobacz 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 programem SQL Server, zwiększ odpowiednie wartości parametrów limitu czasu połączenia i sprawdź, czy połączenie ostatecznie powiedzie się. Jeśli na przykład używasz System.Data.SqlClientmetody , ustaw właściwość SqlConnection.ConnectionTimeout na wartość 30 lub wyższą.

        Uwaga 16.

        Jeśli używasz innych dostawców, sprawdź stronę główną 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 zakończy się powodzeniem, jest to problem z siecią. Aby rozwiązać ten problem, musisz współpracować z administratorem sieci. Po rozwiązaniu problemu możesz przywrócić ustawienia domyślne w aplikacji.

      Uwaga 16.

      Zwiększenie limitu czasu połączenia w aplikacji jest możliwą metodą, ale nie jest to długoterminowe rozwiązanie. 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 błędu

W poniższej tabeli wymieniono typowe przyczyny i rozwiązania dotyczące przekroczenia limitu czasu wygasłych błędów. Aby uzyskać więcej porad i sugestii, zobacz Rozwiązywanie problemów: upłynął limit czasu.

Typowe przyczyny Rozwiązania
Nazwa serwera została wpisana niepoprawnie. Spróbuj ponownie, podając poprawną nazwę serwera.
Usługa SQL Server na serwerze nie jest uruchomiona. Uruchom wystąpienie aparatu bazy danych programu SQL Server.
Port TCP/IP dla wystąpienia aparatu bazy danych jest blokowany przez zaporę. Skonfiguruj zaporę, aby zezwolić na dostęp do aparatu bazy danych.
Aparat bazy danych nie nasłuchuje na porcie 1433. Dzieje się tak, ponieważ port został zmieniony lub nie jest to wystąpienie domyślne, a 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, na który nasłuchuje program 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 określ numer portu TCP/IP do 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 włączony protokół wspólny przy użyciu programu SQL Server Configuration Manager. Jeśli na przykład klient łączy się przy użyciu gniazd TCP/IP, ale program SQL Server nasłuchuje tylko w nazwanych potokach, nie można nawiązać łączności.
Sieć nie może rozpoznać nazwy serwera na adres IP — można to przetestować za pomocą programów ping lub telnet. Rozwiąż problem z rozpoznawaniem nazw komputera w sieci lub nawiąż połączenie z serwerem przy użyciu adresu IP — nie jest to problem z programem 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 przetestować za pomocą programu ping, telnet lub tracert . Rozwiąż problem z protokołem TCP/IP w sieci — nie jest to problem z programem SQL Server. Aby uzyskać pomoc, zobacz dokumentację systemu Windows lub skontaktuj się z administratorem sieci.
Aby uzyskać bardziej zaawansowane rozwiązywanie problemów z siecią, zobacz 0300 Sporadyczne lub okresowe problemy z siecią.

Zobacz też