Resistencia de la conexión en el controlador ODBC

Descargar controlador ODBC

Para garantizar que las aplicaciones permanecen conectadas a una instancia de Azure SQL Database, el controlador ODBC puede restaurar conexiones inactivas.

Importante

La característica de resistencia de conexión es compatible con las versiones de servidores de Microsoft Azure SQL Database y SQL Server 2014 y posteriores.

La característica está disponible en Windows a partir de Microsoft ODBC Driver 11 for SQL Server. Está disponible en Linux a partir de la versión 17.2 de Microsoft ODBC Driver 17 for SQL Server.

Para obtener más información sobre la resistencia de conexión inactiva, vea el artículo técnico sobre esta característica.

Para controlar el comportamiento de reconexión, ODBC Driver for SQL Server tiene dos opciones:

  • Número de reintentos de conexión.

    La opción de número de reintentos de conexión controla las veces que se realizan intentos de reconexión si se produce un error de conexión. Los valores válidos oscilan entre 0 y 255. Cero (0) significa que no se intentará realizar la reconexión. El valor predeterminado es un intento de reconexión.

    Puede modificar el número de reintentos de conexión:

    • Cuando defina o modifique un origen de datos que utiliza ODBC Driver for SQL Server con el control Número de reintentos de conexión.

    • Use la palabra clave de cadena de conexión ConnectRetryCount.

      Para recuperar el número de intentos de reconexión, use el atributo de conexión SQL_COPT_SS_CONNECT_RETRY_COUNT (solo lectura). Si una aplicación se conecta a un servidor que no admite la resistencia de conexión, SQL_COPT_SS_CONNECT_RETRY_COUNT devuelve 0.

  • Intervalo de reintentos de conexión.

    La opción de intervalo de reintentos de conexión especifica el número de segundos entre cada reintento de conexión. Los valores válidos oscilan entre 1 y 60. El tiempo total para volver a realizar la reconexión no puede superar el de espera de conexión (SQL_ATTR_QUERY_TIMEOUT en SQLSetStmtAttr). El valor predeterminado es 10 segundos.

    Puede modificar el intervalo de reintentos de conexión:

    • Cuando defina o modifique un origen de datos que utiliza ODBC Driver for SQL Server con el control Intervalo de reintentos de conexión.

    • Use la palabra clave de cadena de conexión ConnectRetryInterval.

      Para recuperar la longitud del intervalo de reintentos de conexión, use el atributo de conexión SQL_COPT_SS_CONNECT_RETRY_INTERVAL (solo lectura).

Si una aplicación establece una conexión con SQL_DRIVER_COMPLETE_REQUIRED y después trata de ejecutar una instrucción en una conexión interrumpida, el controlador ODBC no mostrará nuevamente el cuadro de diálogo. Además, durante la recuperación en curso:

  • Durante la recuperación, cualquier llamada a SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) debe devolver SQL_CD_FALSE.
  • Si se produce un error en la recuperación, cualquier llamada a SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) debe devolver SQL_CD_TRUE.

Cualquier función que ejecuta un comando en el servidor devuelve los siguientes códigos de estado:

State Mensaje
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.

Ejemplo

El siguiente ejemplo contiene dos funciones. func1 muestra cómo puede conectarse con un nombre de origen de datos (DSN) que utiliza ODBC Driver for SQL Server en Windows. El DSN utiliza la autenticación de SQL Server y especifica el identificador de usuario. Después, func1 recupera el número de reintentos de conexión con SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 usa SQLDriverConnect, la palabra clave de conexión ConnectRetryCount y los atributos de conexión para recuperar la configuración de los reintentos de conexión y el intervalo de reintentos.

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

Consulte también

Microsoft ODBC Driver for SQL Server