Partager via


Résilience de connexion dans le pilote ODBC

Télécharger le pilote ODBC

Pour vous assurer que les applications restent connectées à Azure SQL Database, le pilote ODBC peut rétablir les connexions inactives.

Important

La fonctionnalité de résilience des connexions est prise en charge sur les versions de serveurs Microsoft Azure SQL Database et SQL Server 2014 (et versions 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 retourner SQL_CD_FALSE.
  • Si la récupération échoue, tout appel à SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) doit retourner SQL_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_for_userID;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();
}

Voir aussi

Pilote ODBC Microsoft pour SQL Server