ODBC sürücüsünde bağlantı dayanıklılığı

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ü ConnectRetryCount kullanı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_COUNT desteklemeyen 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ü ConnectRetryInterval kullanı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_FALSE dö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();
}

Ayrıca bakınız

Microsoft SQL Server için ODBC Sürücüsü