Résilience de connexion dans le pilote ODBC
Pour s’assurer que les applications restent connectées, le pilote ODBC peut restaurer les connexions inactives.
Important
La fonction de résilience de la connexion est prise en charge par la Base de données Microsoft Azure SQL, la base de données Fabric SQL et les versions de serveur SQL Server 2014 (et ultérieures).
Cette fonctionnalité est disponible sur Windows depuis Microsoft ODBC Driver 11 for SQL Server. Elle est disponible sur Linux depuis la version 17.2 de Microsoft ODBC Driver 17 for SQL Server.
Pour plus d’informations sur la résilience des connexions inactives, consultez Article technique - Résilience des connexions inactives.
Pour contrôler le comportement de reconnexion, ODBC Driver for SQL Server propose deux options :
Nombre de tentatives de connexion.
Contrôle le nombre de nouvelles tentatives de connexion en cas d’échec de connexion. Les valeurs valides sont comprises entre 0 et 255. Zéro (0) signifie qu’il ne faut pas essayer de se reconnecter. La valeur par défaut est une (1) nouvelle tentative de connexion.
Vous pouvez modifier le nombre de tentatives de connexion quand vous :
définissez ou modifiez une source de données qui utilise ODBC Driver pour SQL Server avec le contrôle Nombre de nouvelles tentatives de connexion.
Utilisez le mot clé de chaîne de connexion
ConnectRetryCount
.Pour récupérer le nombre de nouvelles tentatives de connexion, utilisez l’attribut de connexion
SQL_COPT_SS_CONNECT_RETRY_COUNT
(lecture seule). Si une application se connecte à un serveur qui ne prend pas en charge la résilience de connexion,SQL_COPT_SS_CONNECT_RETRY_COUNT
retourne 0.
Intervalle avant nouvelle tentative de connexion.
L’intervalle avant nouvelle tentative de connexion spécifie le nombre de secondes entre chaque nouvelle tentative de connexion. Les valeurs valides sont comprises entre 1 et 60. La durée totale de reconnexion ne peut pas dépasser le délai de maintien de la connexion (SQL_ATTR_QUERY_TIMEOUT dans SQLSetStmtAttr). La valeur par défaut est 10 secondes.
Vous pouvez modifier l’intervalle de nouvelle tentative de connexion quand vous :
définissez ou modifiez une source de données qui utilise ODBC Driver pour SQL Server avec le contrôle Intervalle avant nouvelle tentative de connexion.
Utilisez le mot clé de chaîne de connexion
ConnectRetryInterval
.Pour récupérer la durée de l’intervalle avant nouvelle tentative de la connexion, utilisez l’attribut de connexion
SQL_COPT_SS_CONNECT_RETRY_INTERVAL
(lecture seule).
Si une application établit une connexion avec SQL_DRIVER_COMPLETE_REQUIRED et essaie ultérieurement d’exécuter une instruction sur une connexion interrompue, le pilote ODBC ne réaffiche pas la boîte de dialogue. De plus, quand la récupération est en cours :
- Pendant la récupération, tout appel à
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)
doit retournerSQL_CD_FALSE
. - Si la récupération échoue, tout appel à
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)
doit retournerSQL_CD_TRUE
.
Les codes d’état suivants sont retournés par toute fonction qui exécute une commande sur le serveur :
State | Message |
---|---|
IMC01 |
The connection is broken and recovery is not possible. The client driver attempted to recover the connection one or more times and all attempts failed. Increase the value of ConnectRetryCount to increase the number of recovery attempts. |
IMC02 |
The server did not acknowledge a recovery attempt, connection recovery is not possible. |
IMC03 |
The server did not preserve the exact client TDS version requested during a recovery attempt, connection recovery is not possible. |
IMC04 |
The server did not preserve the exact server major version requested during a recovery attempt, connection recovery is not possible. |
IMC05 |
The connection is broken and recovery is not possible. The connection is marked by the server as unrecoverable. No attempt was made to restore the connection. |
IMC06 |
The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection. |
Exemple
L’exemple suivant contient deux fonctions. func1
montre comment se connecter avec un nom de source de données qui utilise ODBC Driver pour SQL Server sur Windows. Le nom de source de données utilise l’authentification SQL Server et spécifie l’identifiant utilisateur. func1
récupère ensuite le nombre de tentatives de connexion avec SQL_COPT_SS_CONNECT_RETRY_COUNT
.
func2
utilise SQLDriverConnect
, le mot clé de chaîne de connexion ConnectRetryCount
et les attributs de connexion pour récupérer le paramètre pour les tentatives de connexion et l’intervalle avant nouvelle tentative.
// Connection_resiliency.cpp
// compile with: odbc32.lib
#include <windows.h>
#include <stdio.h>
#include <sqlext.h>
#include <msodbcsql.h>
void func1() {
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLSMALLINT i = 21;
// Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
// Connect to data source
retcode = SQLConnect(hdbc, (SQLCHAR*)"MyDSN", SQL_NTS, (SQLCHAR*)"userID", SQL_NTS, (SQLCHAR*)"password_for_userID", SQL_NTS);
retcode = SQLGetConnectAttr(hdbc, SQL_COPT_SS_CONNECT_RETRY_COUNT, &i, SQL_IS_INTEGER, NULL);
// Allocate statement handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// Process data
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}
void func2() {
SQLHENV henv;
SQLHDBC hdbc1;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLSMALLINT i = 21;
#define MAXBUFLEN 255
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=server_that_supports_connection_resiliency;Encrypt=yes;UID=userID;PWD=<password>;ConnectRetryCount=2";
SQLCHAR ConnStrOut[MAXBUFLEN];
SQLSMALLINT cbConnStrOut = 0;
// Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3_80, SQL_IS_INTEGER);
// Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
// Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
// SQLSetConnectAttr(hdbc1, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
retcode = SQLDriverConnect(hdbc1, NULL, ConnStrIn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
}
retcode = SQLGetConnectAttr(hdbc1, SQL_COPT_SS_CONNECT_RETRY_COUNT, &i, SQL_IS_INTEGER, NULL);
retcode = SQLGetConnectAttr(hdbc1, SQL_COPT_SS_CONNECT_RETRY_INTERVAL, &i, SQL_IS_INTEGER, NULL);
}
}
}
int main() {
func1();
func2();
}