Odolnost připojení (JDBC)

Stáhnout ovladač JDBC

Odolnost připojení umožňuje ovladači JDBC transparentně obnovit poškozené nečinné připojení a pokud selže, zkuste počáteční připojení zopakovat. Tento článek se zabývá dvěma vlastnostmi připojovacího řetězce, které řídí toto chování (connectRetryCount a connectRetryInterval) a nastavení keepalive, které ovladač používá k detekci vynechané nečinné připojení. Odolnost připojení je k dispozici od verze 10.2.0 ovladače Microsoft JDBC Driver for SQL Server. Opětovné připojení přerušeného nečinného připojení vyžaduje verze SQL Server 2014 a novějších, nebo Azure SQL Database.

Tip

Odolnost připojení vůči výpadkům pouze zopakuje počáteční připojení a tiše obnoví přerušená neaktivní připojení. Pokud chcete automaticky opakovat neúspěšné příkazy (například oběť zablokování 1205 nebo vypršení časového limitu uzamčení 1222) nebo rozšířit seznam opakování připojení vlastními chybovými čísly (například Azure SQL přechodnými chybami, jako je 40197 nebo 40613), použijte konfigurovatelnou logiku opakování. CRL je založené na pravidlech, zvolíte chyby a záložní mechanismus a funguje spolu s funkcemi popsanými v tomto článku.

Jak ovladač JDBC opakuje pokusy

Ovladač JDBC poskytuje tři nezávislé mechanismy opakování. Spolupracují, abyste je mohli používat najednou:

Mechanismus Jak funguje Kde se dozvědět více
Odolnost nečinných připojení Transparentně obnoví nefunkční nečinné připojení (například připojení ve fondu uzavřené serverem nebo nástrojem pro vyrovnávání zatížení). Zjištění nefunkčních nečinných připojení (tento článek)
Opakování počátečního připojení Opakuje pokus o navázání neúspěšného počátečního připojení v pevných intervalech pro předdefinovaný seznam přechodných chyb. Opakování počátečních připojení (tento článek)
Konfigurovatelná logika opakování (CRL) Opakování pokusu na základě pravidel při neúspěšných příkazech a pro vlastní čísla chyb. Představeno v ovladači Microsoft JDBC 12.10. Konfigurovatelná logika opakování

Opakování počátečních připojení

Ovladač JDBC obsahuje dvě vlastnosti připojení, které řídí, jak často a jak dlouho ovladač čeká před opakováním počátečního připojení. Přidejte tyto vlastnosti do připojovací řetězec nebo je nastavte prostřednictvím vlastností zdroje dat.

Keyword Hodnoty Výchozí Description
connectRetryCount Celé číslo mezi 0 a 255 (včetně) 1 Maximální počet pokusů o navázání nebo obnovení spojení před vzdáním se. Ve výchozím nastavení ovladač provede jeden pokus o opakování. Hodnota 0 zakáže opakování.
connectRetryInterval Celé číslo mezi 1 a 60 (včetně) 10 Doba mezi opakovanými pokusy o připojení v sekundách. Ovladač se okamžitě pokusí znovu připojit, když zjistí přerušené neaktivní připojení, a pak počká connectRetryInterval sekund, než se znovu pokusí o připojení. Tato vlastnost je ignorována, pokud connectRetryCount je 0.

Ovladač spustí první opakování ihned a čeká connectRetryInterval několik sekund před každým dalším pokusem, takže connectRetryCount opakované pokusy trvají asi (connectRetryCount - 1) * connectRetryInterval několik sekund. loginTimeout ohraničuje celou sekvenci: ovladač přestane opakovat pokus, jakmile uplynulý čas plus connectRetryInterval dosáhne loginTimeout, což nastane o jeden interval dříve než samotné loginTimeout.

Tyto vlastnosti opakují pouze předdefinovaný seznam přechodných chyb připojení. Úplný seznam zahrnutých chyb (4060, 40197, 40501, 40613, 49918-49920 a další) najdete v seznamu předdefinovaných přechodných chyb připojení. Pokud chcete do této sady přidat vlastní chybová čísla nebo je zcela nahradit, použijte retryConn v konfigurovatelné logikě opakování. Pokud chcete zopakovat neúspěšné příkazy, použijte retryExec ve stejném článku.

Caution

Pokud nastavíte retryConn bez úvodní +čáry , nahrazuje to vestavěný seznam místo jeho rozšíření. Jakákoli vestavěná chyba, kterou sami neuvedete, včetně 40613, se již nezkouší znovu.

Nastavení vlastností

Nastavte connectRetryCount a connectRetryInterval v adrese JDBC URL, v objektu Properties nebo v objektu SQLServerDataSource.

V adrese URL JDBC:

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

S objektem Properties . Ukázky kódu v jazyce Java v tomto článku kvůli stručnosti vynechávají importy a obalující deklarace tříd.

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

Pomocí SQLServerDataSource:

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

Připojte se k automaticky pozastavené serverless databázi

Když používáte Azure SQL Database bez serveru s povolenou automatickou pauzou, databáze se obnoví při prvním pokusu o připojení. Tento pokus selže s chybou 40613 během obnovení. Databáze se obvykle obnoví za méně než jednu minutu. Více informací naleznete v části Automatické pozastavení a automatické obnovení.

Chyba 40613 se nachází ve vestavěném seznamu chyb přechodného připojení, takže ovladač znovu zkusí připojení. Vaše aplikace v tomto případě nepotřebuje vlastní smyčku opakovaného pokusu. Výchozí nastavení nepokrývají obnovení: connectRetryCount je 1 a ovladač tento jediný opakovaný pokus spustí okamžitě. Oba pokusy probíhají, zatímco databáze stále pokračuje, takže aplikace chybu zaznamená.

Pro zpracování životopisu spojte všechny tři vlastnosti dohromady:

Property Proč na tom záleží
connectRetryCount Určuje, kolik opakovaných pokusů je k dispozici. Nastavte ji vyšší než výchozí hodnotu 1.
connectRetryInterval Určuje rozestup mezi opakovanými pokusy. První opakovaný pokus je okamžitý; ovladač před každým dalším čeká po tuto dobu.
loginTimeout Vymezuje celou posloupnost. Ovladač přestane opakovat pokusy, jakmile uplynulý čas plus connectRetryInterval dosáhne loginTimeout.

Následující hodnoty se opakují asi minutu, což pokrývá typický životopis:

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

Samotné zvyšování loginTimeout nepomáhá, protože pokus o připojení s 40613 rychle selže místo zaseknutí. Samotné zvýšení connectRetryCount samo o sobě také nepomáhá, protože loginTimeout sekvenci předčasně ukončí.

Zjistit přerušená neaktivní připojení

Typické nečinné připojení je jedno, které se nachází ve fondu připojení. Ovladač považuje připojení za nečinné po přibližně 30 sekundách bez aktivity. Server nebo síťové zařízení mezi klientem a serverem může zavřít nečinná připojení, takže ovladač potřebuje způsob, jak si všimnout, že soket je mrtvý, než se spustí další dotaz.

K detekci poškozených nečinných připojení ovladač spoléhá na pakety tcp keepalive na úrovni soketu. V systému Linux s jazykem Java 11 a novějšími verzemi ovladač automaticky povoluje pakety keepalive v 30sekundovém intervalu (KeepAliveTime), s prodlevou 1 sekundy mezi opakovanými pokusy, když dojde k selhání (KeepAliveInterval).

Důležité

V Windows a v Java 11 nebo starších musíte v operačním systému nakonfigurovat funkce keepalives ručně, aby bylo možné využít obnovení nefunkčního nečinného připojení. Informace o tom, jak nakonfigurovat keepalives, najdete v tématu Připojení k databázi Azure SQL.

Omezení

Ovladač nemůže obnovit poškozené nečinné připojení, pokud jsou splněné některé z následujících podmínek:

  • Je otevřena množina výsledků, která není zcela zpracována ani uložena do vyrovnávací paměti.
  • Připojení přepnulo databázi v Azure SQL.
  • Existuje otevřená transakce.