Megosztás:


Kapcsolat rugalmassága az ODBC-illesztőben

ODBC-illesztőprogram letöltése

Annak érdekében, hogy az alkalmazások továbbra is csatlakoztatva maradjanak, az ODBC-illesztő visszaállíthatja az inaktív kapcsolatokat.

Fontos

A kapcsolat rugalmassági funkciója támogatott a Microsoft Azure SQL Database, a Fabric SQL Database és az SQL Server 2014 (és újabb) kiszolgálóverzióiban.

A funkció Windows rendszeren érhető el, kezdve az SQL Serverhez készült Microsoft ODBC Driver 11-zel. Linuxon érhető el az SQL Serverhez készült Microsoft ODBC Driver 17 17.2-es verziójától kezdve.

Az inaktív kapcsolatok rugalmasságáról további információt a műszaki cikk – Tétlen kapcsolat rugalmassága című témakörben talál.

Az újracsatlakozási viselkedés szabályozásához az SQL Server ODBC-illesztőprogramjának két lehetősége van:

  • Kapcsolat ismétlési száma.

    A csatlakozási újrapróbálkozások száma szabályozza az újracsatlakozási kísérletek számát, ha csatlakozási hiba történik. Az érvényes értékek 0 és 255 között mozognak. A nulla (0) azt jelenti, hogy ne kíséreljen meg újracsatlakozni. Az alapértelmezett érték egy újracsatlakozási kísérlet.

    Az újrapróbálkozások számát a következő esetekben módosíthatja:

    • Definiálhat vagy módosíthat olyan adatforrást, amely az SQL Server ODBC-illesztőjét használja a Kapcsolat újrapróbálkozási száma vezérlővel.

    • Használja a kapcsolat string ConnectRetryCount kulcsszót.

      A kapcsolat újrapróbálkozási kísérleteinek számának lekéréséhez használja az SQL_COPT_SS_CONNECT_RETRY_COUNT (írásvédett) kapcsolatattribútumot. Ha egy alkalmazás olyan kiszolgálóhoz csatlakozik, amely nem támogatja a kapcsolat rugalmasságát, SQL_COPT_SS_CONNECT_RETRY_COUNT 0 értéket ad vissza.

  • Kapcsolódási újrapróbálkozási időköz.

    A kapcsolódási újrapróbálkozási időköz az egyes újrapróbálkozási kísérletek között eltelt másodpercek számát határozza meg. Az érvényes értékek 1–60. Az újracsatlakozáshoz szükséges teljes idő nem haladhatja meg a kapcsolati időtúllépést (SQL_ATTR_QUERY_TIMEOUT az SQLSetStmtAttr-ben). Az alapértelmezett érték 10 másodperc.

    A kapcsolat újrapróbálkozási időközét a következő esetekben módosíthatja:

    • Definiálhat vagy módosíthat egy adatforrást, amely az SQL Server ODBC-illesztőjét használja a Connect Retry Interval vezérlővel.

    • Használja a kapcsolati sztring ConnectRetryInterval kulcsszót.

      A kapcsolat újrapróbálkozási időközének hosszának lekéréséhez használja az SQL_COPT_SS_CONNECT_RETRY_INTERVAL (írásvédett) kapcsolatattribútumot.

Ha egy alkalmazás kapcsolatot létesít SQL_DRIVER_COMPLETE_REQUIRED, és később megpróbál egy utasítást végrehajtani egy megszakadt kapcsolaton keresztül, az ODBC-illesztő nem fogja ismét megjeleníteni a párbeszédpanelt. Emellett a folyamatban lévő helyreállítás során

  • A helyreállítás során a(z) SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) hívásnak SQL_CD_FALSE értéket kell visszaadnia.
  • Ha a helyreállítás sikertelen, minden hívásnak SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)SQL_CD_TRUE értéket kell visszaadnia.

A következő állapotkódokat bármely olyan függvény adja vissza, amely parancsot hajt végre a kiszolgálón:

Állam 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

Az alábbi minta két függvényt tartalmaz. func1 Bemutatja, hogyan csatlakozhat egy olyan adatforrásnévvel (DSN), amely a Windowson futó SQL Server ODBC-illesztőjét használja. A DSN SQL Server-hitelesítést használ, és megadja a felhasználói azonosítót. func1 ezután a SQL_COPT_SS_CONNECT_RETRY_COUNT segítségével lekéri a kapcsolati újrapróbálkozások számát.

A func2 a SQLDriverConnect kapcsolati karakterlánc kulcsszavát és a ConnectRetryCount kapcsolati attribútumokat használja a kapcsolati újrapróbálkozások számának és az újrapróbálkozás időközének beállításának lekérésére.

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

Lásd még

Microsoft ODBC-meghajtó SQL Serverhez