Se connecter à une base de données Azure SQL
Cet article aborde les problèmes rencontrés lors de l’utilisation de Pilote Microsoft JDBC pour SQL Server pour la connexion à une base de données Azure SQL Database. Pour plus d’informations sur la connexion à un Azure SQL Database , consultez :
Détails
Pour vous connecter à une base de données Azure SQL Database, connectez-vous à la base de données MASTER pour appeler SQLServerDatabaseMetaData.getCatalogs.
Azure SQL Database ne prend pas en charge le retour de l’ensemble complet de catalogues d’une base de données utilisateur. SQLServerDatabaseMetaData.getCatalogs utilise la vue sys.databases pour récupérer les catalogues. Pour comprendre le comportement de SQLServerDatabaseMetaData.getCatalogs sur une base de données Azure SQL Database, consultez la discussion relative aux autorisations dans sys.databases (Transact-SQL).
Délai de connexion dépassé
Lorsque vous vous connectez à des bases de données Azure SQL, la durée par défaut recommandée du loginTimeout
est de 30 secondes. Si vous vous connectez à une instance serverless, il est recommandé d’utiliser un loginTimeout
encore plus long (60 secondes ou plus). Si l’instance serverless a été inactive, la mise en éveil peut prendre un certain temps lors d’une connexion initiale. Pour plus d’informations sur la définition de loginTimeout
, consultez Définition des propriétés de connexion.
Connexions supprimées
Lors de la connexion à une base de données Azure SQL Database, les connexions inactives peuvent être arrêtées par un composant réseau (comme un pare-feu) après une période d’inactivité. Il existe deux types de connexions inactives dans ce contexte :
Les connexions inactives sur la couche TCP, lorsque les connexions peuvent être supprimées par n'importe quel dispositif réseau.
Les connexions inactives via la passerelle Azure SQL, en cas de messages TCP keepalive (qui rendent la connexion non inactive du point de vue de TCP), mais sans requête active pendant 30 minutes. Dans ce scenario, la passerelle détermine que la connexion TDS est inactive à 30 minutes et l'arrête.
Pour résoudre le deuxième point et éviter que la passerelle interrompe les connexions inactives, vous pouvez :
Utiliser la stratégie de connexion Rediriger pour configurer votre source de données Azure SQL.
Maintenir les connexions actives via une activité légère. Cette méthode n’est pas recommandée. Elle doit être utilisée uniquement si aucune autre option n’est possible.
Pour répondre au premier point et éviter la suppression des connexions inactives par un composant réseau, définissez les paramètres de registre suivants (ou leurs équivalents non Windows) sur le système d’exploitation dans lequel se trouve le pilote :
Paramètre de registre | Valeur recommandée |
---|---|
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 |
Redémarrez l’ordinateur pour appliquer les paramètres du Registre.
Les valeurs KeepAliveTime et KeepAliveInterval sont exprimées en millisecondes. Ces paramètres entraînent la déconnexion d’une connexion qui ne répond pas dans un délai de 10 à 40 secondes. Après l’envoi d’un paquet Keep Alive, si aucune réponse n’est reçue, une nouvelle tentative est effectuée toutes les secondes jusqu’à 10 fois. Si aucune réponse n’est reçue pendant cette période, le socket côté client est déconnecté. Selon votre environnement, vous souhaiterez peut-être augmenter la valeur de KeepAliveInterval pour tenir compte des interruptions connues (telles que les migrations de machines virtuelles) susceptibles de provoquer le blocage d’un serveur pendant plus de 10 secondes.
Notes
TcpMaxDataRetransmissions n’est pas contrôlable sur Windows Vista ou sur Windows 2008 et versions ultérieures.
Pour configurer cela dans une machine virtuelle Azure, créez une tâche de démarrage pour ajouter les clés de Registre. Par exemple, ajoutez la tâche de démarrage suivante au fichier de définition du service :
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
Ajoutez ensuite un fichier AddKeepAlive.cmd à votre projet. Définissez le paramètre « Copier dans le répertoire de sortie » sur « Toujours copier ». Le script suivant est un exemple de fichier 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
Ajouter le nom de serveur à l'ID d'utilisateur dans la chaîne de connexion
Avant la version 4.0 du Pilote Microsoft JDBC pour SQL Server, lors de la connexion à Azure SQL Database, vous deviez ajouter le nom du serveur à l’ID d’utilisateur dans la chaîne de connexion. Par exemple, utilisateur@nomserveur. À compter de la version 4.0 de Pilote Microsoft JDBC pour SQL Server, il n’est plus nécessaire d’ajouter @servername à l’ID d’utilisateur dans la chaîne de connexion.
L'utilisation du chiffrement requiert la définition de hostNameInCertificate
Avant la version 7.2 du Pilote Microsoft JDBC pour SQL Server, vous devez spécifier hostNameInCertificate quand vous vous connectez à une base de données Azure SQL Database si vous spécifiez encrypt=true (si le nom du serveur dans la chaîne de connexion est nom_court.nom_domaine, définissez la propriété hostNameInCertificate sur *.nom_domaine). Cette propriété est facultative depuis la version 7.2 du pilote.
Par exemple :
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=myPassword;encrypt=true;hostNameInCertificate=*.int.mscds.com;