微软ODBC服务器驱动,Windows ODBC 驱动程序中的连接弹性
Windows ODBC 驅動程序中的連接彈性
09/01/2020
本文內容
為了確保應用程序能與 Azure SQL 數據庫 保持連接,Windows 上的 ODBC 驅動程序可以還原空閑連接。
重要
Microsoft Azure SQL 數據庫和 SQL Server 2014(及更高版本)服務器版本支持連接復原能力功能。
若要詳細了解空閑連接復原,請參閱技術文章 - 空閑連接復原。
為控制重新連接行為,Windows 上 的 ODBC Driver for SQL Server 有以下兩個選項:
連接重試計數。
連接重試計數可在發生連接失敗時,控制重新連接嘗試的次數。 有效值范圍為 0 到 255。 零 (0) 表示不嘗試重新連接。 默認值為一次重新連接嘗試。
在以下情況下可以修改連接重試次數:
定義或修改一個將 ODBC Driver for SQL Server 與“連接重試計數”**** 控件結合使用的數據源。
使用 ConnectRetryCount 連接字符串關鍵字。
若要檢索連接重試嘗試的次數,請使用 SQL_COPT_SS_CONNECT_RETRY_COUNT(只讀)連接屬性****。 如果應用程序連接到的服務器并不支持連接復原,SQL_COPT_SS_CONNECT_RETRY_COUNT 將返回 0。
連接重試間隔。
連接重試間隔指定每次連接重試嘗試之間的秒數。 有效值介于 1 和 60 之間。 重新連接的總時間不能超過連接超時(SQLSetStmtAttr 中的 SQL_ATTR_QUERY_TIMEOUT)。 默認值為 10 秒。
在以下情況下可以修改連接重試間隔:
定義或修改一個將 ODBC Driver for SQL Server 與“連接重試間隔”**** 控件結合使用的數據源。
使用 ConnectRetryInterval 連接字符串關鍵字。
若要檢索連接重試間隔的時間長度,請使用 SQL_COPT_SS_CONNECT_RETRY_INTERVAL(只讀)連接屬性****。
如果應用程序建立與 SQL_DRIVER_COMPLETE_REQUIRED 的連接,并稍后嘗試通過斷開的連接執行語句,ODBC 驅動程序將不再顯示該對話框。 此外,在恢復正在進行期間,
在恢復期間,任何對 SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) 的調用都必須返回 SQL_CD_FALSE********。
如果恢復失敗,任何對 SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD) 的調用都必須返回 SQL_CD_TRUE********。
在服務器上執行命令的任何函數都會返回以下狀態代碼:
狀態
Message
IMC01
連接已斷開,且不能恢復。 客戶端驅動程序嘗試一次或多次恢復連接,但所有嘗試均失敗。 增大 ConnectRetryCount 的值以增加恢復嘗試的次數。
IMC02
服務器未收到恢復嘗試,無法恢復連接。
IMC03
服務器未保留恢復嘗試過程中請求的確切客戶端 TDS 版本,無法恢復連接。
IMC04
服務器未保留恢復嘗試過程中請求的確切服務器主要版本,無法恢復連接。
IMC05
連接已斷開,且不能恢復。 服務器將連接標記為不可恢復。 未嘗試還原連接。
IMC06
連接已斷開,且不能恢復。 客戶端驅動程序將連接標記為不可恢復。 未嘗試還原連接。
示例
以下示例包含兩個函數。 func1 演示如何通過使用 Windows 上的 ODBC Driver for SQL Server 的數據源名稱 (DSN) 建立連接。 DSN 使用 SQL Server 身份驗證,并指定用戶 ID。 然后,func1**** 使用 SQL_COPT_SS_CONNECT_RETRY_COUNT**** 檢索連接重試次數。
func2 使用 SQLDriverConnect、 ConnectRetryCount 連接字符串關鍵字和連接屬性,檢索連接重試和重試間隔的設置。
// Connection_resiliency.cpp
// compile with: odbc32.lib
#include
#include
#include
#include
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 17 for SQL Server};SERVER=server_that_supports_connection_resiliency;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();
}
另請參閱
總結
以上是生活随笔為你收集整理的微软ODBC服务器驱动,Windows ODBC 驱动程序中的连接弹性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java循环的嵌套执行
- 下一篇: rust windows 交叉编译_树莓