Herstellen einer Verbindung mit einer Azure SQL-Datenbank

JDBC-Treiber herunterladen

In diesem Artikel werden Probleme behandelt, die auftreten können, wenn mit dem Microsoft JDBC-Treiber für SQL Server eine Verbindung mit einer Azure SQL-Datenbank-Instanz hergestellt wird. Weitere Informationen zum Herstellen einer Verbindung mit einer Azure SQL-Datenbank-Instanz finden Sie unter:

Details

Um eine Verbindung mit einer Azure SQL-Datenbank herzustellen, sollten Sie zum Aufrufen von SQLServerDatabaseMetaData.getCatalogs eine Verbindung mit der Masterdatenbank herstellen.
Die Rückgabe sämtlicher Kataloge aus einer Benutzerdatenbank wird von Azure SQL-Datenbank nicht unterstützt. SQLServerDatabaseMetaData.getCatalogs verwendet die Ansicht „sys.databases“, um Kataloge abzurufen. Eine Erläuterung zum Verhalten von SQLServerDatabaseMetaData.getCatalogs in einer Azure SQL-Datenbank-Instanz finden Sie im Abschnitt „Berechtigungen“ des Artikels sys.databases (Transact-SQL).

Anmeldungstimeout

Beim Herstellen einer Verbindung mit Azure SQL-Datenbanken ist die empfohlene Standardeinstellung für loginTimeout 30 Sekunden. Wenn Sie eine Verbindung mit einer serverlosen Instanz herstellen, wird empfohlen, einen noch längeren Wert für loginTimeout von 60 Sekunden oder mehr zu verwenden. Wenn sich die serverlose Instanz im Leerlauf befand, kann die Reaktivierung für eine anfängliche Verbindung einige Zeit dauern. Weitere Informationen zum Festlegen von loginTimeout finden Sie unter Festlegen von Verbindungseigenschaften.

Getrennte Verbindungen

Wenn Sie eine Verbindung mit einer Azure SQL-Datenbank herstellen, können Verbindungen im Leerlauf nach einer Phase ohne Aktivität durch eine Netzwerkkomponente (z. B. eine Firewall) getrennt werden. In diesem Kontext werden zwei Arten von inaktiven Verbindungen behandelt:

  • Inaktive Verbindungen auf der TCP-Ebene, wobei Verbindungen von einer beliebigen Anzahl von Netzwerkgeräten gelöscht werden können.

  • Durch das Azure SQL-Gateway ermittelte, inaktive Verbindungen. Dabei kann das TCP Keepalive-Meldungen ausgeben (wodurch sie aus TCP-Sicht nicht inaktiv sind), über die jedoch in den letzten 30 Minuten keine aktive Abfrage ausgeführt wurde. In diesem Szenario ermittelt das Gateway, ob sich die TDS-Verbindung nach 30 Minuten im Leerlauf befindet, und die Verbindung wird beendet.

Um den zweiten Punkt zu behandeln und zu vermeiden, dass das Gateway Verbindungen im Leerlauf abbricht, können Sie wie folgt vorgehen:

  • Verwenden Sie zum Konfigurieren der Azure SQL-Datenquelle die VerbindungsrichtlinieRedirect (Umleiten).

  • Halten Sie Verbindungen über eine einfache Aktivität aktiv. Diese Methode wird nicht empfohlen und sollte nur verwendet werden, wenn es keine anderen Möglichkeiten gibt.

Um den ersten Punkt zu behandeln und zu vermeiden, dass Verbindungen im Leerlauf durch eine Netzwerkkomponente getrennt werden, legen Sie die folgenden Registrierungseinstellungen oder deren Nicht-Windows-Äquivalente für das Betriebssystem fest, unter dem der Treiber geladen wurde:

Registrierungseinstellung Empfohlener Wert
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

Starten Sie den Computer neu, damit die Registrierungseinstellungen wirksam werden.

Die KeepAliveTime- und KeepAliveInterval-Werte sind in Millisekunden angegeben. Diese Einstellungen bewirken, dass eine nicht reagierende Verbindung innerhalb von 10 bis 40 Sekunden getrennt wird. Wenn nach dem Senden eines Keepalive-Pakets keine Antwort empfangen wird, wird dies bis zu zehnmal sekündlich erneut versucht. Wenn in dieser Zeit keine Antwort empfangen wird, wird die Verbindung zum clientseitigen Socket getrennt. Abhängig von Ihrer Umgebung müssen Sie möglicherweise den „KeepAliveInterval“-Wert erhöhen, um bekannte Störungen (z. B. Migrationen virtueller Computer) auszugleichen, die dazu führen können, dass ein Server länger als zehn Sekunden nicht mehr antwortet.

Hinweis

„TcpMaxDataRetransmissions“ ist unter Windows Vista oder Windows 2008 und höher nicht steuerbar.

Um dieses Verhalten auf einer Azure-VM zu konfigurieren, erstellen Sie eine Startaufgabe zum Hinzufügen der Registrierungsschlüssel. Fügen Sie der Dienstdefinitionsdatei beispielsweise folgenden Starttask hinzu:

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

Fügen Sie dem Projekt anschließend eine Datei „AddKeepAlive.cmd“ hinzu. Legen Sie die Einstellung In Ausgabeverzeichnis kopieren auf Immer kopieren fest. Das folgende Skript ist eine AddKeepAlive.cmd-Beispieldatei:

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  

Anfügen des Servernamens an die UserID in der Verbindungszeichenfolge

Vor Version 4.0 von Microsoft JDBC-Treiber für SQL Server war es zum Herstellen einer Verbindung mit einer Azure SQL-Datenbank erforderlich, den Servernamen an die UserID in der Verbindungszeichenfolge anzufügen. z. B. „Benutzer@Servername“. Ab Version 4.0 von Microsoft JDBC-Treiber für SQL Server muss @servername nicht mehr an die UserID in der Verbindungszeichenfolge angefügt werden.

Einstellung „hostNameInCertificate“ zur Verwendung der Verschlüsselung erforderlich

Falls Sie eine Vorgängerversion von Version 7.2 des Microsoft JDBC-Treibers für SQL Server verwenden, sollten Sie beim Herstellen einer Verbindung mit einer Azure SQL-Datenbank-Instanz hostNameInCertificate angeben, wenn Sie encrypt=true angeben. Wenn der Servername in der Verbindungszeichenfolge shortName.domainName lautet, legen Sie die hostNameInCertificate-Eigenschaft auf *.domainName fest. Diese Eigenschaft ist ab Version 7.2 des Treibers optional.

Beispiel:

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

Weitere Informationen

Verbinden mit SQL Server mit dem JDBC-Treiber