Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: SQL Server
Podsumowanie
Błąd "Upłynął limit czasu" w SQL Server oznacza, że operacja połączenia lub polecenia nie została ukończona w przedziale czasu dozwolonym przez aplikację kliencką, więc klient anulował operację zamiast czekać na czas nieokreślony. Ten artykuł ułatwia określenie, czy przekroczono limit czasu połączenia, czy limit czasu zapytania lub polecenia. Obejmuje on komunikaty o błędach, które mogą wystąpić z przekroczeniem limitu czasu połączenia, a typowa usługa, port, zapora i rozpoznawanie nazw powodują przekroczenie limitu czasu połączenia. Użyj tego artykułu, gdy aplikacja kliencka sporadycznie lub stale kończy się niepowodzeniem, aby nawiązać połączenie z wystąpieniem SQL Server z błędami przekroczenia limitu czasu połączenia.
Aby rozwiązać problemy z błędami przekroczenia limitu czasu zapytania lub polecenia, zobacz Rozwiązywanie problemów z błędami przekroczenia limitu czasu zapytania.
Uwaga 16.
Przed rozpoczęciem rozwiązywania problemów sprawdź wymagania wstępne i zapoznaj się z listą kontrolną.
Przekroczenie limitu czasu wygasło komunikaty o błędach podczas nawiązywania połączenia z usługą SQL Server
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ń. Aby uzyskać więcej informacji o sposobie działania buforowania, zobacz SQL Server buforowanie połączeń (ADO.NET).
Uwaga 16.
Drugi i trzeci błąd występuje po zainstalowaniu .NET Framework 4.5 lub nowszej wersji.
Określanie typu przekroczenia limitu czasu
Istnieją dwa typy problemów z przekroczeniem limitu czasu, które często występują w przypadku aplikacji bazy danych:
- Limit czasu połączenia (domyślnie 15 sekund)
- Limit czasu zapytania lub polecenia (domyślnie 30 sekund)
Te dwa problemy są bardzo różne w naturze, ponieważ pochodzą z różnych źródeł i występują w oddzielnych niezależnych fazach interakcji aplikacji bazy danych. Przekroczenie limitu czasu połączenia występuje, gdy początkowe połączenie z aparatem bazy danych kończy się niepowodzeniem. Z drugiej strony zapytanie lub przekroczenie limitu czasu polecenia występuje znacznie później w okresie interakcji aplikacji z serwerem bazy danych. Początkowe połączenie zostało pomyślnie nawiązane, ale wykonanie zapytania przesłanego do serwera bazy danych trwa długo.
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.Openwskazuje, ż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
SqlCommandsłuży do pracy z zapytaniem, a nie z połączeniem. MetodaExecuteScalarsłuży do uruchamiania zapytania. Można również wyświetlić inne elementy, takie jak lubExecuteReaderExecuteNonQuery.Jeśli wystąpi błąd przekroczenia limitu czasu zapytania lub polecenia, zobacz Rozwiązywanie problemów z błędami przekroczenia limitu czasu zapytania.
Rozwiązywanie problemów z błędami przekroczenia limitu czasu połączenia w SQL Server
Jeśli wystąpi błąd przekroczenia limitu czasu połączenia, wykonaj następujące kroki:
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ą. Jeśli używasz bieżącego Microsoft. Sterownik Data.SqlClient ustaw równoważną właściwość SqlConnection.ConnectionTimeout.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ść.
Jeśli połączenie zakończy się powodzeniem, jest to problem z siecią. Skontaktuj się z administratorem sieci, aby rozwiązać ten problem. 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.
Przyczyny błędów przekroczenia limitu czasu połączenia przez usługę, port i protokół
W poniższej tabeli wymieniono SQL Server usługi, portu i protokołu sieciowego przyczyny wygasłych błędów przekroczenia limitu czasu oraz sposób ich rozwiązywania. Aby uzyskać więcej porad i sugestii, zobacz Rozwiązywanie problemów: upłynął limit czasu.
| Typowe przyczyny | Rozwiązania |
|---|---|
| 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. Aby uzyskać więcej informacji, zobacz Konfigurowanie serwera do nasłuchiwania na określonym porcie TCP. |
| 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 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. |
Przyczyny błędów przekroczenia limitu czasu połączenia przez sieć i rozpoznawanie nazw
W poniższej tabeli wymieniono przyczyny przekroczenia limitu czasu wygasłe błędy, takie jak błędy rozpoznawania nazw DNS i problemy z routingiem TCP/IP oraz sposób ich rozwiązywania.
| Typowe przyczyny | Rozwiązania |
|---|---|
| Nazwa serwera została wpisana niepoprawnie. | Spróbuj ponownie, podając poprawną nazwę serwera. |
| Sieć nie może rozpoznać nazwy serwera na adres IP. Przetestuj ten problem przy użyciu programów ping lub telnet. | Rozwiąż problem z rozpoznawaniem nazw komputerów w sieci lub nawiąż połączenie z serwerem przy użyciu adresu IP. Ten problem nie jest problemem 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. Przetestuj ten problem przy użyciu programu ping, telnet lub tracert . | Rozwiąż problem z protokołem TCP/IP w sieci. Ten problem nie jest problemem 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ą. |
Treści powiązane
- Rozwiązywanie problemów z łącznością w programie SQL Server
- Rozwiązywanie problemów z przekroczeniem limitu czasu zapytania
- Pojawił się błąd związany z siecią lub instancją podczas ustanawiania połączenia z SQL Server
- Zbieranie danych w celu rozwiązywania problemów z łącznością z programem SQL Server
- Sporadyczne lub okresowe problemy z siecią
- Microsoft ADO.NET dla programu SQL Server