Share via


Verbindingstolerantie in het ODBC-stuurprogramma

ODBC-stuurprogramma downloaden

Om ervoor te zorgen dat toepassingen verbonden blijven, kan het ODBC-stuurprogramma niet-actieve verbindingen herstellen.

Belangrijk

De functie voor verbindingstolerantie wordt ondersteund in serverversies van Microsoft Azure SQL Database, Fabric SQL Database en SQL Server 2014 (en hoger).

De functie is beschikbaar in Windows vanaf Microsoft ODBC-stuurprogramma 11 voor SQL Server. Het is beschikbaar op Linux vanaf versie 17.2 van Microsoft ODBC-stuurprogramma 17 voor SQL Server.

Zie het technische artikel - Niet-actieve verbindingstolerantie voor meer informatie over niet-actieve verbindingstolerantie.

Het ODBC-stuurprogramma voor SQL Server heeft twee opties om het gedrag van opnieuw verbinden te beheren:

  • Aantal nieuwe pogingen voor verbinding.

    Het aantal nieuwe pogingen om verbinding te maken, bepaalt het aantal pogingen om opnieuw verbinding te maken als er een verbindingsfout optreedt. Geldige waarden variëren van 0 tot 255. Nul (0) betekent dat er geen poging wordt gedaan om opnieuw verbinding te maken. De standaardwaarde is één poging om opnieuw verbinding te maken.

    U kunt het aantal nieuwe pogingen wijzigen wanneer u:

    • Definieer of wijzig een gegevensbron die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server met de instelling Aantal verbindingpogingen.

    • Gebruik het verbindingsreeks sleutelwoord ConnectRetryCount.

      Gebruik het SQL_COPT_SS_CONNECT_RETRY_COUNT verbindingskenmerk (alleen-lezen) om het aantal nieuwe pogingen voor de verbinding op te halen. Als een toepassing verbinding maakt met een server die geen ondersteuning biedt voor verbindingstolerantie, SQL_COPT_SS_CONNECT_RETRY_COUNT retourneert u 0.

  • Interval voor opnieuw verbinding maken.

    Het interval voor het opnieuw proberen van verbinding geeft het aantal seconden aan tussen elke poging tot opnieuw proberen van de verbinding. Geldige waarden zijn 1-60. De totale tijd die nodig is om opnieuw verbinding te maken, kan de time-out van de verbinding (SQL_ATTR_QUERY_TIMEOUT in SQLSetStmtAttr) niet overschrijden. De standaardwaarde is 10 seconden.

    U kunt het interval voor het opnieuw proberen van de verbinding wijzigen wanneer u:

    • Definieer of wijzig een gegevensbron die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server met de controle Interval voor opnieuw proberen verbinden.

    • Gebruik het trefwoord voor de ConnectRetryInterval verbindingsreeks.

      Als u de lengte van het interval voor het opnieuw proberen van de verbinding wilt ophalen, gebruikt u het SQL_COPT_SS_CONNECT_RETRY_INTERVAL verbindingskenmerk (alleen-lezen).

Als een toepassing een verbinding tot stand brengt met SQL_DRIVER_COMPLETE_REQUIRED en later probeert een instructie uit te voeren via een verbroken verbinding, wordt het dialoogvenster niet opnieuw weergegeven in het ODBC-stuurprogramma. Ook tijdens het lopende herstel,

  • Tijdens het herstel moet elke aanroep naar SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), terugkeren SQL_CD_FALSE.
  • Als het herstel mislukt, moet een aanroep naar SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)SQL_CD_TRUE retourneren.

De volgende statuscodes worden geretourneerd door een functie die een opdracht uitvoert op de server:

Staat 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

Het volgende voorbeeld bevat twee functies. func1 laat zien hoe u verbinding kunt maken met een gegevensbronnaam (DSN) die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server in Windows. De DSN maakt gebruik van SQL Server-verificatie en geeft de gebruikers-id op. func1 haalt vervolgens het aantal nieuwe pogingen voor de verbinding op met SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 gebruikt SQLDriverConnect, ConnectRetryCount verbindingsreeks trefwoord en verbindingskenmerken om de instelling voor nieuwe pogingen en interval voor pogingen op te halen.

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

Zie ook

Microsoft ODBC-stuurprogramma voor SQL Server-