Verbinding maken met een Azure SQL-database

JDBC-stuurprogramma downloaden

In dit artikel worden problemen besproken wanneer u het Microsoft JDBC-stuurprogramma voor SQL Server gebruikt om verbinding te maken met een Azure SQL Database. Zie voor meer informatie om verbinding te maken met een Azure SQL Database:

Bijzonderheden

Als u verbinding wilt maken met een Azure SQL Database, moet u verbinding maken met de hoofddatabase om SQLServerDatabaseMetaData.getCatalogs aan te roepen.
Azure SQL Database biedt geen ondersteuning voor het retourneren van de volledige set catalogi uit een gebruikersdatabase. SQLServerDatabaseMetaData.getCatalogs gebruikt de sys.databases weergave om de catalogi op te halen. Om het gedrag van SQLServerDatabaseMetaData.getCatalogs op een Azure SQL Database te begrijpen, zie de bespreking van permissies in sys.databases.

Time-out voor aanmelden

Wanneer je verbinding maakt met Azure SQL-databases, is de loginTimeout standaard van 30 seconden een redelijk startpunt. Voor Azure SQL Database serverless met auto-pauze ingeschakeld, verhoog deze zodat deze de verbindingspogingen van de driver kan vasthouden terwijl de database wordt hervat. Voor meer informatie, zie Verbind met een automatisch gepauzeerde serverloze database. Zie Verbindingseigenschappen instellen om loginTimeout in te stellen.

Verbindingen verbroken

Wanneer je verbinding maakt met een Azure SQL Database, kan een netwerkcomponent (zoals een firewall) de inactieve verbindingen beëindigen na een periode van inactiviteit. In deze context zijn er twee typen inactieve verbindingen:

  • Niet actief op de TCP-laag, waar verbindingen kunnen worden verwijderd door een willekeurig aantal netwerkapparaten.

  • Inactief volgens de Azure SQL Gateway, waar TCP-keepalive berichten kunnen optreden (waardoor de verbinding vanuit TCP-perspectief niet als inactief wordt beschouwd), maar in de afgelopen 30 minuten geen actieve query heeft gehad. In dit scenario bepaalt de gateway dat de TDS-verbinding gedurende 30 minuten inactief is en de verbinding wordt beëindigd.

U kunt het volgende doen om het tweede punt aan te pakken en te voorkomen dat de gateway niet-actieve verbindingen beëindigt:

  • Gebruik het omleidenverbindingsbeleid om uw Azure SQL-gegevensbron te configureren.

  • Houd verbindingen actief via lichtgewicht activiteit. Deze methode wordt niet aanbevolen en mag alleen worden gebruikt als er geen andere mogelijke opties zijn.

Als u het eerste punt wilt aanpakken en wilt voorkomen dat niet-actieve verbindingen worden verbroken door een netwerkonderdeel, stelt u de volgende registerinstellingen of hun niet-Windows-equivalenten in op het besturingssysteem waar het stuurprogramma wordt geladen.

Opmerking

Vanaf versie 10.2 van het Microsoft JDBC-stuurprogramma voor SQL Server stelt het stuurprogramma automatisch de volgende waarden voor keep alive in op sockets die worden gemaakt tijdens databaseverbindingen, waarbij de standaardinstellingen van het besturingssysteem worden overschreven die zijn gedefinieerd in de volgende tabel. Deze automatische instelling wordt alleen uitgevoerd op versies van Java die ondersteuning bieden voor het instellen van de socket keep alive-opties. In Linux en macOS ondersteunen de nieuwste updates van Java 8+ deze instelling. In Windows ondersteunen de nieuwste updates van Java 17+ deze instelling.

Registerinstelling Aanbevolen waarde
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime 30.000
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval 1000
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions 10

Start de computer opnieuw op om de registerinstellingen van kracht te laten worden.

De waarden KeepAliveTime en KeepAliveInterval bevinden zich in milliseconden. Deze instellingen zorgen ervoor dat een niet-reagerende verbinding binnen 10 tot 40 seconden wordt verbroken. Als er geen antwoord wordt ontvangen nadat een keep alive-pakket is verzonden, wordt het elke seconde tot 10 keer opnieuw geprobeerd. Als er gedurende die tijd geen antwoord wordt ontvangen, wordt de verbinding met de socket aan de clientzijde verbroken. Afhankelijk van uw omgeving wilt u mogelijk de KeepAliveInterval verhogen om bekende onderbrekingen (bijvoorbeeld migraties van virtuele machines) te voorkomen, waardoor een server langer dan 10 seconden niet meer reageert.

Opmerking

TcpMaxDataRetransmissions is niet aanpasbaar op Windows Vista of Windows 2008 en hoger.

Als u dit wilt configureren in een Azure-VM, maakt u een opstarttaak om de registersleutels toe te voegen. Voeg bijvoorbeeld de volgende opstarttaak toe aan het servicedefinitiebestand:

<Startup>  
    <Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">  
    </Task>  
</Startup>  

Voeg vervolgens een AddKeepAlive.cmd-bestand toe aan uw project. Stel de instelling 'Kopiëren naar uitvoermap' in op Altijd kopiëren. Het volgende script is een voorbeeldbestand 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  

Voeg de servernaam toe aan de userId in de verbindingsreeks

Vóór de 4.0-versie van het Microsoft JDBC-stuurprogramma voor SQL Server, moest u de servernaam toevoegen aan de UserId in de verbindingsreeks om verbinding te maken met een Azure SQL Database. Bijvoorbeeld user@servername. Vanaf versie 4.0 van de Microsoft JDBC Driver voor SQL Server is het niet meer nodig om @servername aan de UserId toe te voegen in de verbindingsreeks.

Voor het gebruik van versleuteling is het instellen van hostNameInCertificate vereist

Voordat u verbinding maakt met een Azure SQL Database met het Microsoft JDBC-stuurprogramma voor SQL Server versie 7.2, moet u hostNameInCertificate opgeven als u encrypt=true opgeeft (Als de servernaam in de connectiestring shortName.domainName is, stel de eigenschap hostNameInCertificate in op *. domainName.). Deze eigenschap is optioneel vanaf versie 7.2 van het stuurprogramma.

Voorbeeld:

jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;