Condividi tramite


Resilienza della connessione nel driver ODBC

Scaricare il driver ODBC

Per garantire che le applicazioni rimangano connesse, il driver ODBC può ripristinare le connessioni inattive.

Importante

La funzionalità di resilienza della connessione è supportata in database SQL di Microsoft Azure, nel database SQL dell'infrastruttura e nelle versioni server di SQL Server 2014 (e versioni successive).

La funzionalità è disponibile in Windows a partire da Microsoft ODBC Driver 11 for SQL Server. È disponibile in Linux a partire dalla versione 17.2 di Microsoft ODBC Driver 17 for SQL Server.

Per altre informazioni sulla resilienza delle connessioni inattive, vedere l'articolo tecnico Resilienza delle connessioni inattive.

Per controllare il comportamento di riconnessione, il Driver ODBC per SQL Server include due opzioni:

  • ConnectRetryCount.

    ConnectRetryCount consente di controllare il numero di tentativi di riconnessione se si verifica un errore di connessione. I valori validi sono compresi tra 0 e 255. Zero (0) indica che non vengono eseguiti tentativi di riconnessione. Il valore predefinito è un tentativo di riconnessione.

    È possibile modificare il numero di tentativi di connessione quando si:

    • Definisce o modifica un'origine dati che usa ODBC Driver for SQL Server con il controllo ConnectRetryCount.

    • Usare la ConnectRetryCount parola chiave della stringa di connessione.

      Per recuperare il numero di tentativi di connessione, usare l'attributo di connessione SQL_COPT_SS_CONNECT_RETRY_COUNT (sola lettura). Se un'applicazione si connette a un server che non supporta la resilienza della connessione, SQL_COPT_SS_CONNECT_RETRY_COUNT restituisce 0.

  • ConnectRetryInterval.

    ConnectRetryInterval consente di specificare il numero di secondi che deve intercorrere tra ogni tentativo di connessione. I valori validi sono 1-60. Il tempo totale per la riconnessione non può superare il timeout della connessione (SQL_ATTR_QUERY_TIMEOUT in SQLSetStmtAttr). Il valore predefinito è 10 secondi.

    È possibile modificare l'intervallo tra i tentativi di connessione quando si:

    • Definisce o modifica un'origine dati che usa ODBC Driver for SQL Server con il controllo ConnectRetryInterval.

    • Usare la ConnectRetryInterval parola chiave della stringa di connessione.

      Per recuperare la lunghezza dell'intervallo dei tentativi di connessione, usare l'attributo di connessione SQL_COPT_SS_CONNECT_RETRY_INTERVAL (sola lettura).

Se un'applicazione stabilisce una connessione con SQL_DRIVER_COMPLETE_REQUIRED e successivamente cerca di eseguire un'istruzione su una connessione interrotta, il driver ODBC non visualizzerà di nuovo la finestra di dialogo. Inoltre, durante il ripristino:

  • Durante il ripristino, tutte le chiamate a SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), devono restituire SQL_CD_FALSE.
  • Se il recupero fallisce, tutte le chiamate a SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), devono restituire SQL_CD_TRUE.

I seguenti codici di stato vengono restituiti da qualsiasi funzione che esegue un comando nel server:

Provincia 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.

Esempio

L'esempio seguente contiene due funzioni. func1 mostra come connettersi con un nome dell'origine dati (DSN) che usa ODBC Driver for SQL Server in Windows. Il nome DSN usa l'autenticazione di SQL Server e specifica l'ID utente. func1 recupera quindi il numero di tentativi di connessione con SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 usa SQLDriverConnect, la parola chiave della stringa di connessione ConnectRetryCount e gli attributi di connessione per recuperare l'impostazione per i tentativi di connessione e l'intervallo tra i tentativi.

// 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();
}

Vedi anche

Driver Microsoft ODBC per SQL Server