Resistencia de la conexión en el controlador ODBC
Para asegurarse de que las aplicaciones permanecen conectadas, el controlador ODBC puede restaurar las conexiones inactivas.
Importante
La característica de resistencia de conexión es compatible con las versiones de servidores de Microsoft Azure SQL Database, Base de datos SQL de Fabric y SQL Server 2014 (y versiones 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 devolverSQL_CD_FALSE
. - Si se produce un error en la recuperación, cualquier llamada a
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)
debe devolverSQL_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>;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();
}