Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek popisuje problémy při použití ovladače Microsoft JDBC pro SQL Server pro připojení ke službě Azure SQL Database. Další informace o připojení ke službě Azure SQL Database najdete tady:
Podrobnosti
Pokud se chcete připojit ke službě Azure SQL Database, měli byste se připojit k hlavní databázi a volat SQLServerDatabaseMetaData.getCatalogs.
Azure SQL Database nepodporuje vrácení celé sady katalogů z uživatelské databáze.
SQLServerDatabaseMetaData.getCatalogs používá sys.databases tento pohled k získání katalogů. Pro pochopení chování SQLServerDatabaseMetaData.getCatalogs na Azure SQL Database viz diskuse o oprávněních v sys.databases.
Časový limit přihlášení
Když se připojujete k databázím Azure SQL, loginTimeout výchozí hodnota 30 sekund je rozumným výchozím bodem. Pro Azure SQL Database serverless s povoleným automatickým pozastavením zvyšte tento limit tak, aby zvládl opakované pokusy ovladače o připojení, zatímco se databáze obnovuje. Další informace najdete v článku Připojení k automaticky pozastavené bezserverové databázi. Pro nastavení loginTimeoutviz Nastavení vlastností spojení.
Připojení byla přerušena
Když se připojíte k Azure SQL Database, síťová komponenta (například firewall) může ukončit nečinná připojení po určité době nečinnosti. V tomto kontextu existují dva typy nečinných spojení:
Nečinná ve vrstvě TCP, kde je možné připojení vyřadit libovolným počtem síťových zařízení.
Připojení nečinné z pohledu služby Azure SQL Gateway, kde se můžou vyskytovat zprávy typu keepalive protokolu TCP (kvůli tomu připojení není nečinné z pohledu protokolu TCP), ale za posledních 30 minut nedošlo k žádnému aktivnímu dotazu. V tomto scénáři brána určí, že připojení TDS je nečinné po 30 minutách, a poté ukončí připojení.
K řešení druhého bodu a vyhnutí se ukončování nečinných připojení pomocí Gateway můžete:
K nastavení zdroje dat Azure SQL použijte přesměrovánízásady připojení.
Zachovejte připojení aktivní prostřednictvím zjednodušené aktivity. Tato metoda se nedoporučuje a měla by se používat jenom v případě, že neexistují žádné další možné možnosti.
Pokud chcete vyřešit první bod a vyhnout se vyřazení nečinných připojení síťovými komponentami, nastavte následující nastavení registru nebo jejich ekvivalenty jiného systému než Windows v operačním systému, kde je ovladač načten:
Poznámka:
Počínaje verzí 10.2 ovladače Microsoft JDBC pro SQL Server ovladač automaticky nastaví následující hodnoty udržování na soketech, které vytvoří během databázových připojení a přepisuje výchozí hodnoty operačního systému definované v následující tabulce. Toto automatické nastavení se provádí pouze ve verzích Javy, které podporují nastavení možností udržování soketu naživu. V Linuxu a macOS podporují toto nastavení nejnovější aktualizace Javy 8 a novější. Nejnovější aktualizace Javy 17 nebo novější podporují toto nastavení ve Windows.
| Nastavení registru | Doporučená hodnota |
|---|---|
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1 000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions | 10 |
Restartujte počítač, aby se projevilo nastavení registru.
Hodnoty KeepAliveTime a KeepAliveInterval jsou v milisekundách. Tato nastavení způsobují, že nereagující připojení se během 10 až 40 sekund odpojí. Pokud po odeslání paketu keep alive nepřijde žádná odpověď, pokus se opakuje každou sekundu, až 10krát. Pokud během této doby nebyla přijata žádná odpověď, odpojí se soket na straně klienta. V závislosti na vašem prostředí můžete chtít zvýšit hodnotu KeepAliveInterval tak, aby vyhovovala známým přerušením (například migrace virtuálních počítačů), což může způsobit, že server přestane reagovat déle než 10 sekund.
Poznámka:
TcpMaxDataRetransmissions není možné ovládat v systémech Windows Vista nebo Windows 2008 a novějších.
Pokud chcete tento postup nakonfigurovat na virtuálním počítači Azure, vytvořte spouštěcí úlohu pro přidání klíčů registru. Například do definičního souboru služby přidejte následující úlohu Spuštění.
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
Pak do projektu přidejte soubor AddKeepAlive.cmd. Nastavte možnost Kopírovat do výstupního adresáře na možnost Kopírovat vždy. Následující skript je ukázkový soubor AddKeepAlive.cmd:
if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on Azure SQL
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
Připojte název serveru k ID uživatele v připojovacím řetězci.
Před verzí 4.0 ovladače Microsoft JDBC pro SQL Server jste k připojení ke službě Azure SQL Database museli připojit název serveru k ID uživatele v připojovacím řetězci. Například user@servername. Počínaje verzí 4.0 ovladače Microsoft JDBC pro SQL Server už není nutné připojit @servername k ID uživatele v připojovacím řetězci.
Použití šifrování vyžaduje nastavení hostNameInCertificate.
Před verzí 7.2 ovladače Microsoft JDBC pro SQL Server byste měli zadat hostNameInCertificate, pokud zadáte encrypt=true (pokud je název serveru v připojovacím řetězci shortName.domainName, nastavte hostNameInCertificate na *.domainName). Tato vlastnost je volitelná od verze 7.2 ovladače.
Například:
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;