Sdílet prostřednictvím


Odolnost připojení v ovladači ODBC

Stáhnout ovladač ODBC

Aby aplikace zůstaly připojené, ovladač ODBC může obnovit nečinná připojení.

Důležité

Funkce odolnosti připojení je podporovaná ve verzích serveru Microsoft Azure SQL Database, Fabric SQL Database a SQL Server 2014 (a novějších).

Tato funkce je dostupná ve Windows počínaje ovladačem Microsoft ODBC 11 pro SQL Server. Je k dispozici v Linuxu od verze 17.2 ovladače Microsoft ODBC 17 pro SQL Server.

Další informace o odolnosti nečinných připojení najdete v technickém článku – Odolnost nečinných připojení.

Pro řízení chování opětovného připojení má ovladač ODBC pro SQL Server dvě možnosti:

  • Počet opakování připojení.

    Počet opakování připojení řídí počet pokusů o opětovné připojení, pokud dojde k selhání připojení. Platné hodnoty jsou v rozsahu od 0 do 255. Nula (0) znamená, že se nepokoušejte se znovu připojit. Výchozí hodnota je jeden pokus o opětovné připojení.

    Počet opakovaných pokusů o připojení můžete změnit v těchto případech:

    • Definujte nebo upravte zdroj dat, který používá ovladač ODBC pro SQL Server pomocí ovládacího prvku Počet opakování připojení .

    • Použijte klíčové slovo připojovacího ConnectRetryCount řetězce.

      Pokud chcete načíst počet pokusů o opakování připojení, použijte SQL_COPT_SS_CONNECT_RETRY_COUNT atribut připojení (jen pro čtení). Pokud se aplikace připojí k serveru, který nepodporuje odolnost připojení, SQL_COPT_SS_CONNECT_RETRY_COUNT vrátí hodnotu 0.

  • Interval opakování připojení.

    Interval opakování připojení určuje počet sekund mezi jednotlivými pokusy o opakování připojení. Platné hodnoty jsou 1–60. Celková doba opětovného připojení nesmí překročit časový limit připojení (SQL_ATTR_QUERY_TIMEOUT v SQLSetStmtAttr). Výchozí hodnota je 10 sekund.

    Interval opakování připojení můžete změnit, když:

    • Definujte nebo upravte zdroj dat, který používá ovladač ODBC pro SQL Server pomocí ovládacího prvku Connect Retry Interval .

    • Použijte klíčové slovo připojovacího ConnectRetryInterval řetězce.

      Pokud chcete načíst délku intervalu opakování připojení, použijte SQL_COPT_SS_CONNECT_RETRY_INTERVAL atribut připojení (jen pro čtení).

Pokud aplikace vytvoří připojení k SQL_DRIVER_COMPLETE_REQUIRED a později se pokusí spustit příkaz přes přerušené připojení, ovladač ODBC dialogové okno znovu nezobrazí. Také během probíhajícího obnovení

  • Během obnovení musí jakékoli volání na SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) vrátit SQL_CD_FALSE.
  • Pokud obnovení selže, jakékoli volání na SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) musí vrátit SQL_CD_TRUE.

Následující stavové kódy vrátí libovolná funkce, která na serveru spustí příkaz:

Stát 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

Následující ukázka obsahuje dvě funkce. func1 znázorňuje, jak se můžete připojit pomocí názvu zdroje dat (DSN), který používá ovladač ODBC pro SQL Server ve Windows. DSN používá ověřování SQL Serveru a určuje ID uživatele. func1 pak načte počet opakovaných pokusů o připojení s SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 používá SQLDriverConnectklíčové ConnectRetryCount slovo připojovacího řetězce a atributy připojení k načtení nastavení pro opakování připojení a interval opakování.

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

Viz také

ovladač Microsoft ODBC pro SQL Server