Ketahanan koneksi di driver ODBC

Unduh driver ODBC

Untuk memastikan bahwa aplikasi tetap terhubung ke Database Azure SQL, driver ODBC dapat memulihkan koneksi diam.

Penting

Fitur ketahanan koneksi didukung pada versi server Microsoft Azure SQL Database dan SQL Server 2014 (dan yang lebih baru).

Fitur ini tersedia di Windows yang dimulai dengan Microsoft ODBC Driver 11 untuk SQL Server. Ini tersedia di Linux mulai versi 17.2 dari Microsoft ODBC Driver 17 untuk SQL Server.

Untuk informasi selengkapnya tentang ketahanan koneksi diam, lihat Artikel Teknis - Ketahanan Koneksi Menganggur.

Untuk mengontrol perilaku koneksi ulang, Driver ODBC untuk SQL Server memiliki dua opsi:

  • Jumlah coba lagi koneksi.

    Hubungkan jumlah coba lagi mengontrol jumlah upaya koneksi ulang jika ada kegagalan koneksi. Nilai yang valid berkisar antara 0 hingga 255. Nol (0) berarti jangan mencoba menyambungkan kembali. Nilai default adalah satu upaya koneksi ulang.

    Anda dapat mengubah jumlah percobaan ulang koneksi saat:

    • Tentukan atau ubah sumber data yang menggunakan Driver ODBC untuk SQL Server dengan kontrol Jumlah Coba Lagi Koneksi.

    • ConnectRetryCount Gunakan kata kunci string koneksi.

      Untuk mengambil jumlah upaya coba lagi koneksi, gunakan SQL_COPT_SS_CONNECT_RETRY_COUNT atribut koneksi (baca saja). Jika aplikasi tersambung ke server yang tidak mendukung ketahanan koneksi, SQL_COPT_SS_CONNECT_RETRY_COUNT mengembalikan 0.

  • Sambungkan interval coba lagi.

    Interval coba lagi sambungkan menentukan jumlah detik antara setiap upaya coba lagi koneksi. Nilai yang valid adalah 1-60. Total waktu untuk terhubung kembali tidak boleh melebihi batas waktu koneksi (SQL_ATTR_QUERY_TIMEOUT di SQLSetStmtAttr). Nilai defaultnya adalah 10 detik.

    Anda dapat mengubah interval coba lagi koneksi saat Anda:

    • Tentukan atau ubah sumber data yang menggunakan Driver ODBC untuk SQL Server dengan kontrol Sambungkan Interval Coba Lagi.

    • ConnectRetryInterval Gunakan kata kunci string koneksi.

      Untuk mengambil panjang interval coba lagi koneksi, gunakan SQL_COPT_SS_CONNECT_RETRY_INTERVAL atribut koneksi (baca saja).

Jika aplikasi membuat koneksi dengan SQL_DRIVER_COMPLETE_REQUIRED dan kemudian mencoba menjalankan pernyataan melalui koneksi yang rusak, driver ODBC tidak akan menampilkan kotak dialog lagi. Juga, selama pemulihan sedang berlangsung,

  • Selama pemulihan, setiap panggilan ke SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), harus mengembalikan SQL_CD_FALSE.
  • Jika pemulihan gagal, panggilan apa pun ke SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), harus mengembalikan SQL_CD_TRUE.

Kode status berikut dikembalikan oleh fungsi apa pun yang menjalankan perintah di server:

Provinsi Pesan
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.

Contoh

Sampel berikut berisi dua fungsi. func1memperlihatkan bagaimana Anda dapat tersambung dengan nama sumber data (DSN) yang menggunakan Driver ODBC untuk SQL Server di Windows. DSN menggunakan Autentikasi SQL Server, dan menentukan ID pengguna. func1 kemudian mengambil jumlah percobaan ulang koneksi dengan SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2SQLDriverConnectmenggunakan kata kunci string ConnectRetryCount koneksi, dan atribut koneksi untuk mengambil pengaturan untuk coba lagi koneksi dan interval coba lagi.

// 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_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();
}

Lihat juga

Microsoft ODBC Driver untuk SQL Server