Resilienza della connessione nel driver ODBC
Per garantire che le applicazioni rimangano connesse, il driver ODBC può ripristinare le connessioni inattive.
Importante
La funzionalità di resilienza della connessione è supportata in database SQL di Microsoft Azure, nel database SQL dell'infrastruttura e nelle versioni server di SQL Server 2014 (e versioni successive).
La funzionalità è disponibile in Windows a partire da Microsoft ODBC Driver 11 for SQL Server. È disponibile in Linux a partire dalla versione 17.2 di Microsoft ODBC Driver 17 for SQL Server.
Per altre informazioni sulla resilienza delle connessioni inattive, vedere l'articolo tecnico Resilienza delle connessioni inattive.
Per controllare il comportamento di riconnessione, il Driver ODBC per SQL Server include due opzioni:
ConnectRetryCount.
ConnectRetryCount consente di controllare il numero di tentativi di riconnessione se si verifica un errore di connessione. I valori validi sono compresi tra 0 e 255. Zero (0) indica che non vengono eseguiti tentativi di riconnessione. Il valore predefinito è un tentativo di riconnessione.
È possibile modificare il numero di tentativi di connessione quando si:
Definisce o modifica un'origine dati che usa ODBC Driver for SQL Server con il controllo ConnectRetryCount.
Usare la
ConnectRetryCount
parola chiave della stringa di connessione.Per recuperare il numero di tentativi di connessione, usare l'attributo di connessione
SQL_COPT_SS_CONNECT_RETRY_COUNT
(sola lettura). Se un'applicazione si connette a un server che non supporta la resilienza della connessione,SQL_COPT_SS_CONNECT_RETRY_COUNT
restituisce 0.
ConnectRetryInterval.
ConnectRetryInterval consente di specificare il numero di secondi che deve intercorrere tra ogni tentativo di connessione. I valori validi sono 1-60. Il tempo totale per la riconnessione non può superare il timeout della connessione (SQL_ATTR_QUERY_TIMEOUT in SQLSetStmtAttr). Il valore predefinito è 10 secondi.
È possibile modificare l'intervallo tra i tentativi di connessione quando si:
Definisce o modifica un'origine dati che usa ODBC Driver for SQL Server con il controllo ConnectRetryInterval.
Usare la
ConnectRetryInterval
parola chiave della stringa di connessione.Per recuperare la lunghezza dell'intervallo dei tentativi di connessione, usare l'attributo di connessione
SQL_COPT_SS_CONNECT_RETRY_INTERVAL
(sola lettura).
Se un'applicazione stabilisce una connessione con SQL_DRIVER_COMPLETE_REQUIRED e successivamente cerca di eseguire un'istruzione su una connessione interrotta, il driver ODBC non visualizzerà di nuovo la finestra di dialogo. Inoltre, durante il ripristino:
- Durante il ripristino, tutte le chiamate a
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)
, devono restituireSQL_CD_FALSE
. - Se il recupero fallisce, tutte le chiamate a
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)
, devono restituireSQL_CD_TRUE
.
I seguenti codici di stato vengono restituiti da qualsiasi funzione che esegue un comando nel server:
Provincia | 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. |
Esempio
L'esempio seguente contiene due funzioni. func1
mostra come connettersi con un nome dell'origine dati (DSN) che usa ODBC Driver for SQL Server in Windows. Il nome DSN usa l'autenticazione di SQL Server e specifica l'ID utente. func1
recupera quindi il numero di tentativi di connessione con SQL_COPT_SS_CONNECT_RETRY_COUNT
.
func2
usa SQLDriverConnect
, la parola chiave della stringa di connessione ConnectRetryCount
e gli attributi di connessione per recuperare l'impostazione per i tentativi di connessione e l'intervallo tra i tentativi.
// 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();
}