Delen via


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 gebruiken de weergave sys.databases om de catalogi op te halen. Raadpleeg de discussie over machtigingen in sys.databases (Transact-SQL) om inzicht te krijgen in het gedrag van SQLServerDatabaseMetaData.getCatalogs in een Azure SQL Database.

Time-out voor aanmelden

Wanneer u verbinding maakt met Azure SQL-databases, is de aanbevolen standaardwaarde loginTimeout 30 seconden. Als u verbinding maakt met een serverloze instantie, wordt aanbevolen een loginTimeout van 60 seconden of meer te gebruiken. Als het serverloze exemplaar inactief is geweest, kan het enige tijd duren voordat de eerste verbinding tot stand is gebracht. Zie loginTimeout voor meer informatie over het instellen van de verbinding.

Verbindingen verbroken

Wanneer u verbinding maakt met een Azure SQL Database, kunnen niet-actieve verbindingen worden beëindigd door een netwerkonderdeel (zoals een firewall) na een periode van inactiviteit. Er zijn twee typen niet-actieve verbindingen, in deze context:

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

Zie ook

verbinding maken met SQL Server met het JDBC-stuurprogramma