Udostępnij przez


Odporność połączenia w sterowniku ODBC

pobierz sterownika ODBC

Aby zapewnić, że aplikacje pozostaną połączone, sterownik ODBC może przywrócić bezczynne połączenia.

Ważne

Funkcja odporności połączenia jest obsługiwana w usługach Microsoft Azure SQL Database, Fabric SQL Database i SQL Server 2014 (i nowszych).

Ta funkcja jest dostępna w systemie Windows, począwszy od sterownika Microsoft ODBC 11 dla programu SQL Server. Jest dostępny w systemie Linux, począwszy od wersji 17.2 sterownika Microsoft ODBC Driver 17 dla programu SQL Server.

Aby uzyskać więcej informacji na temat odporności bezczynności połączenia, zobacz Artykuł techniczny — odporność bezczynności połączenia.

Aby kontrolować zachowanie ponownego nawiązywania połączenia, sterownik ODBC dla programu SQL Server ma dwie opcje:

  • Liczba ponownych prób połączenia.

    Licznik ponownych prób połączeń określa liczbę prób ponownego połączenia w przypadku awarii połączenia. Prawidłowe wartości wahają się od 0 do 255. Zero (0) oznacza, że nie próbuj ponownie nawiązać połączenia. Wartość domyślna to jedna próba ponownego nawiązania połączenia.

    Liczbę ponownych prób połączenia można zmodyfikować w następujących przypadkach:

    • Zdefiniuj lub zmodyfikuj źródło danych używające sterownika ODBC dla programu SQL Server za pomocą kontrolki Liczba ponownych prób połączenia .

    • Użyj słowa kluczowego ConnectRetryCount w łańcuchu połączenia.

      Aby pobrać liczbę ponownych prób nawiązania połączenia, użyj atrybutu SQL_COPT_SS_CONNECT_RETRY_COUNT połączenia (tylko do odczytu). Jeśli aplikacja łączy się z serwerem, który nie obsługuje odporności połączenia, SQL_COPT_SS_CONNECT_RETRY_COUNT zwraca wartość 0.

  • Połącz interwał ponawiania prób.

    Interwał ponawiania prób połączenia określa liczbę sekund między poszczególnymi próbami ponawiania próby połączenia. Prawidłowe wartości to 1–60. Łączny czas ponownego nawiązywania połączenia nie może przekroczyć limitu czasu połączenia (SQL_ATTR_QUERY_TIMEOUT w pliku SQLSetStmtAttr). Wartość domyślna to 10 sekund.

    Interwał ponawiania prób połączenia można zmodyfikować w następujących przypadkach:

    • Zdefiniuj lub zmodyfikuj źródło danych używające sterownika ODBC dla programu SQL Server za pomocą kontrolki Interwał ponawiania próby połączenia .

    • Użyj słowa kluczowego parametru połączenia ConnectRetryInterval.

      Aby pobrać długość interwału ponawiania prób połączenia, użyj atrybutu SQL_COPT_SS_CONNECT_RETRY_INTERVAL połączenia (tylko do odczytu).

Jeśli aplikacja nawiązuje połączenie z SQL_DRIVER_COMPLETE_REQUIRED, a później próbuje wykonać instrukcję za pośrednictwem przerwanego połączenia, sterownik ODBC nie wyświetli ponownie okna dialogowego. Ponadto podczas odzyskiwania w toku,

  • Podczas odzyskiwania każde wywołanie metody SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)musi zwrócić wartość SQL_CD_FALSE.
  • Jeśli odzyskiwanie zakończy się niepowodzeniem, każde wywołanie metody SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)musi zwrócić wartość SQL_CD_TRUE.

Następujące kody stanu są zwracane przez dowolną funkcję, która wykonuje polecenie na serwerze:

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.

Example

Poniższy przykład zawiera dwie funkcje. func1 Pokazuje, jak można nawiązać połączenie z nazwą źródła danych (DSN), która używa sterownika ODBC dla programu SQL Server w systemie Windows. DSN używa SQL Server Authentication i określa identyfikator użytkownika. func1 następnie pobiera liczbę ponownych prób połączenia za pomocą polecenia SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 używa słów kluczowych w parametrze ConnectRetryCount połączenia i atrybutów połączenia, aby pobrać ustawienia dotyczące ponownych prób połączenia oraz interwału między próbami.

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

Zobacz także

sterownik Microsoft ODBC dla programu SQL Server