Odporność połączenia (JDBC)

pobierz sterownik JDBC

Odporność połączenia umożliwia sterownikowi JDBC przezroczyste przywrócenie uszkodzonego bezczynnego połączenia i ponów próbę nawiązania połączenia początkowego, jeśli ulegnie awarii. W tym artykule omówiono dwie właściwości ciągu połączenia, które sterują tym zachowaniem (connectRetryCount i connectRetryInterval), oraz ustawienia keepalive używane przez sterownik do wykrywania zerwanego bezczynnego połączenia. Odporność połączeń jest dostępna od wersji 10.2.0 sterownika Microsoft JDBC Driver for SQL Server. Ponowne nawiązanie zerwanego nieaktywnego połączenia wymaga programu SQL Server 2014 lub nowszego albo usługi Azure SQL Database.

Wskazówka

Odporność połączenia tylko ponawia próbę początkowego połączenia i dyskretnie przywraca uszkodzone bezczynne połączenia. Aby automatycznie ponawiać próbę wykonania instrukcji zakończonych niepowodzeniem (na przykład w przypadku błędu 1205 — ofiary zakleszczenia — lub limitu czasu blokady 1222) albo rozszerzyć listę ponawiania połączenia o niestandardowe numery błędów (na przykład przejściowe błędy usługi Azure SQL, takie jak 40197 lub 40613), użyj Konfigurowalnej logiki ponawiania. CRL opiera się na regułach — wybierasz błędy i mechanizm awaryjny, a ono działa wraz z funkcjami opisanymi w tym artykule.

Jak sterownik JDBC ponawia próbę

Sterownik JDBC zapewnia trzy niezależne mechanizmy ponawiania prób. Współpracują ze sobą, aby można było używać wszystkich z nich jednocześnie:

Mechanizm Do czego służy Gdzie dowiedzieć się więcej
Odporność połączenia w stanie bezczynności W sposób niewidoczny przywraca przerwane bezczynne połączenie (na przykład połączenie w puli zamknięte przez serwer lub moduł równoważenia obciążenia). Wykrywanie uszkodzonych bezczynnych połączeń (w tym artykule)
Ponawianie próby nawiązania połączenia początkowego Ponawia próbę nawiązania nieudanego połączenia początkowego zgodnie z ustalonym harmonogramem dla wbudowanej listy błędów przejściowych. Ponów próbę nawiązania połączeń początkowych (ten artykuł)
Konfigurowalna logika ponawiania prób (CRL) Ponawianie prób oparte na regułach dla instrukcji zakończonych niepowodzeniem oraz dla niestandardowych numerów błędów. Wprowadzono w sterowniku Microsoft JDBC 12.10. Konfigurowalna logika ponawiania prób

Ponów próbę nawiązania połączeń początkowych

Sterownik JDBC zawiera dwie właściwości połączenia, które kontrolują, jak często i jak długo sterownik czeka przed ponowieniu próby nawiązania połączenia początkowego. Dodaj te właściwości do parametry połączenia lub ustaw je za pomocą właściwości źródła danych.

Keyword Wartości Default Description
connectRetryCount Liczba całkowita z zakresu od 0 do 255 (włącznie) 1 Maksymalna liczba prób nawiązania lub ponownego ustanowienia połączenia przed rezygnacją. Domyślnie sterownik wykonuje pojedynczą próbę ponawiania próby. Wartość 0 wyłącza ponawianie próby.
connectRetryInterval Liczba całkowita z zakresu od 1 do 60 (włącznie) 10 Czas (w sekundach) między próbami ponawiania próby połączenia. Sterownik próbuje ponownie nawiązać połączenie natychmiast po wykryciu przerwanego bezczynnego połączenia, a następnie czeka connectRetryInterval kilka sekund przed ponowną próbą. Ta właściwość jest ignorowana, gdy connectRetryCount ma wartość 0.

Sterownik natychmiast wykonuje pierwszą ponowną próbę i czeka connectRetryInterval sekund przed każdą następną, więc connectRetryCount ponowne próby zajmują łącznie około (connectRetryCount - 1) * connectRetryInterval sekund. loginTimeout wyznacza granicę dla całej sekwencji: sterownik przestaje ponawiać próby, gdy czas, który upłynął, plus connectRetryInterval osiąga loginTimeout, co następuje o jeden interwał przed samym loginTimeout.

Te właściwości powodują ponawianie prób tylko w przypadku wbudowanej listy przejściowych błędów połączenia. Pełną listę uwzględnionych błędów (4060, 40197, 40501, 40613, 49918–49920 i innych) można znaleźć w dokumencie Lista wbudowanych błędów przejściowych połączenia. Aby dodać niestandardowe numery błędów do tego zestawu lub zastąpić go w całości, użyj retryConn w Konfigurowanie logiki ponawiania prób. Aby ponowić nieudane instrukcje, użyj retryExec w tym samym artykule.

Caution

Jeśli ustawisz retryConn bez poprzedzającego +, zastąpi ono wbudowaną listę, zamiast ją rozszerzać. Każdy wbudowany błąd, którego sam nie wypiszesz, w tym 40613, nie jest już powtarzany.

Ustawianie właściwości

Ustaw connectRetryCount i connectRetryInterval w adresie URL JDBC, w obiekcie Properties lub w obiekcie SQLServerDataSource.

W adresie URL JDBC:

jdbc:sqlserver://server;databaseName=db;connectRetryCount=3;connectRetryInterval=10

Za pomocą obiektu Properties. Fragmenty kodu Java w tym artykule pomijają importy i otoki klas w celu zwięzłości.

Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("connectRetryCount", "3");
props.setProperty("connectRetryInterval", "10");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);

Z użyciem SQLServerDataSource:

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setUser("...");
ds.setPassword("...");
ds.setConnectRetryCount(3);
ds.setConnectRetryInterval(10);

Połącz się z automatycznie wstrzymaną bezserwerową bazą danych

Gdy używasz Azure SQL Database bez serwera z włączoną automatyczną pauzą, baza danych wznawia się przy pierwszej próbie połączenia. Ta próba kończy się niepowodzeniem z powodu błędu 40613 podczas działania operacji wznawiania. Bazy danych zazwyczaj wracają w mniej niż minutę. Więcej informacji znajdziesz w sekcji Automatyczne wstrzymywanie i automatyczne wznawianie.

Błąd 40613 znajduje się na wbudowanej liście błędów połączenia przejściowego, więc sterownik ponownie próbuje połączenie. Twoja aplikacja nie potrzebuje własnej pętli powtórek w tym przypadku. Domyślne ustawienia nie obejmują wznowienia: connectRetryCount to 1, a sterownik natychmiast wykonuje tę jedyną ponowną próbę. Obie próby następują podczas wznawiania się bazy danych, więc aplikacja zauważa błąd.

Aby obsłużyć CV, połącz wszystkie trzy cechy razem:

Property Dlaczego ma to znaczenie
connectRetryCount Ustawia liczbę ponowień. Ustaw ją powyżej domyślnej wartości 1.
connectRetryInterval Określa odstęp między ponownymi próbami. Pierwsza próba następuje natychmiast; przed każdą kolejną sterownik czeka tyle czasu.
loginTimeout Wyznacza granice całej sekwencji. Sterownik przestaje ponawiać próby, gdy czas, który upłynął, plus connectRetryInterval osiąga loginTimeout.

Następujące wartości powtarzają się przez około minutę, co obejmuje typowe CV:

jdbc:sqlserver://<server>.database.windows.net;databaseName=<database>;encrypt=true;loginTimeout=120;connectRetryCount=5;connectRetryInterval=15

Samo zwiększenie wartości loginTimeout nie pomaga, ponieważ próba połączenia szybko kończy się błędem 40613, zamiast zawisać. Samo podnoszenie connectRetryCount nie pomaga, bo loginTimeout skróca sekwencję.

Wykrywanie uszkodzonych bezczynnych połączeń

Typowe bezczynne połączenie to połączenie znajdujące się w puli połączeń. Sterownik uznaje połączenie za nieaktywne po około 30 sekundach bez aktywności. Serwer lub urządzenie sieciowe między klientem a serwerem może zamknąć bezczynne połączenia, dlatego sterownik potrzebuje sposobu, aby zauważyć, że gniazdo nie działa przed następnym uruchomieniem zapytania.

Aby wykryć uszkodzone bezczynne połączenia, sterownik opiera się na pakietach keepalive TCP na poziomie gniazda. Na Linuksie z wersjami Java 11 i nowszymi, sterownik automatycznie umożliwia pakiety keepalive w odstępie 30 sekund (KeepAliveTime), z 1-sekundowym opóźnieniem między ponownymi próbami w przypadku awarii (KeepAliveInterval).

Ważne

W systemie Windows oraz w Javie 11 lub starszej należy ręcznie skonfigurować mechanizm keepalive w systemie operacyjnym, aby skorzystać z odzyskiwania po zerwaniu bezczynnego połączenia. Aby uzyskać informacje na temat konfigurowania keepalives, zobacz Połączenie z bazą danych Azure SQL.

Ograniczenia

Sterownik nie może przywrócić uszkodzonego bezczynnego połączenia, jeśli spełniony jest dowolny z następujących warunków:

  • Istnieje otwarty zestaw wyników, który nie jest całkowicie analizowany ani buforowany.
  • Połączenie przełączyło bazy danych na Azure SQL.
  • Istnieje otwarta transakcja.