Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
ODBC sürücüsü indirme
Uygulamaların bağlı kalmasını sağlamak için ODBC sürücüsü boşta bağlantıları geri yükleyebilir.
Önemli
Bağlantı dayanıklılığı özelliği Microsoft Azure SQL Veritabanı, Doku SQL veritabanı ve SQL Server 2014 (ve üzeri) sunucu sürümlerinde desteklenir.
Bu özellik, SQL Server için Microsoft ODBC Sürücüsü 11'den başlayarak Windows'ta kullanılabilir. Sql Server için Microsoft ODBC Sürücüsü 17'nin 17.2 sürümünden itibaren Linux'ta kullanılabilir.
Boşta bağlantı dayanıklılığı hakkında daha fazla bilgi için bkz. Teknik Makale - Boşta Bağlantı Dayanıklılığı.
Yeniden bağlanma davranışını denetlemek için SQL Server için ODBC Sürücüsü iki seçeneğe sahiptir:
Bağlantı yeniden deneme sayısı.
Bağlantı yeniden deneme sayısı, bağlantı hatası olduğunda yeniden bağlanma denemelerinin sayısını denetler. Geçerli değerler 0 ile 255 arasında değişir. Sıfır (0), yeniden bağlanmaya çalışma anlamına gelir. Varsayılan değer bir yeniden bağlanma girişimidir.
Aşağıdaki durumlarda bağlantı yeniden denemelerinin sayısını değiştirebilirsiniz:
Bağlantı Yeniden Deneme Sayısı denetimiyle SQL Server için ODBC Sürücüsünü kullanan bir veri kaynağını tanımlayın veya değiştirin.
Bağlantı dizesi anahtar sözcüğünü
ConnectRetryCountkullanın.Bağlantı yeniden deneme sayısını almak için
SQL_COPT_SS_CONNECT_RETRY_COUNT(salt okunur) bağlantı özniteliğini kullanın. Bir uygulama bağlantı dayanıklılığınıSQL_COPT_SS_CONNECT_RETRY_COUNTdesteklemeyen bir sunucuya bağlanırsa 0 döndürür.
Yeniden deneme aralığına bağlanın.
Bağlanma yeniden deneme aralığı, her bağlantı yeniden deneme girişimi arasındaki saniye sayısını belirtir. Geçerli değerler 1-60 arasıdır. Yeniden bağlanmak için toplam süre, bağlantı zaman aşımını (SQLSetStmtAttr'de SQL_ATTR_QUERY_TIMEOUT) aşamaz. Varsayılan değer 10 saniyedir.
Aşağıdaki durumlarda bağlantı yeniden deneme aralığını değiştirebilirsiniz:
Yeniden Deneme Aralığına Bağlan denetimiyle SQL Server için ODBC Sürücüsünü kullanan bir veri kaynağını tanımlayın veya değiştirin.
Bağlantı dizesi anahtar sözcüğünü
ConnectRetryIntervalkullanın.Bağlantı yeniden deneme aralığının uzunluğunu almak için
SQL_COPT_SS_CONNECT_RETRY_INTERVAL(salt okunur) özniteliğini kullanın.
Bir uygulama SQL_DRIVER_COMPLETE_REQUIRED ile bağlantı kurarsa ve daha sonra bozuk bir bağlantı üzerinden bir deyimi yürütmeye çalışırsa, ODBC sürücüsü iletişim kutusunu bir daha görüntülemez. Ayrıca, kurtarma işlemi sürerken,
- Kurtarma sırasında, herhangi bir
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)çağrısıSQL_CD_FALSEdöndürmelidir. - Kurtarma başarısız olursa,
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)'ye yapılacak herhangi bir çağrıSQL_CD_TRUEdöndürmelidir.
Aşağıdaki durum kodları, sunucuda bir komut yürüten herhangi bir işlev tarafından döndürülür:
| Devlet | 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
Aşağıdaki örnek iki işlev içerir.
func1 , Windows üzerinde SQL Server için ODBC Sürücüsünü kullanan bir veri kaynağı adı (DSN) ile nasıl bağlanabileceğinizi gösterir. DSN, SQL Server Kimlik Doğrulaması'nı kullanır ve kullanıcı kimliğini belirtir.
func1, ardından SQL_COPT_SS_CONNECT_RETRY_COUNT ile bağlantı yeniden denemelerinin sayısını alır.
func2
SQLDriverConnect, ConnectRetryCount bağlantı dizesi anahtar sözcüğünü ve bağlantı özniteliklerini kullanarak bağlantı yeniden denemeleri ve yeniden deneme aralığı ayarını alır.
// 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();
}