Menggunakan pencerminan database (JDBC)

Unduh driver JDBC

Pencerminan database terutama merupakan solusi perangkat lunak untuk meningkatkan ketersediaan database dan redundansi data. Driver Microsoft JDBC untuk SQL Server menyediakan dukungan implisit untuk pencerminan database, sehingga pengembang tidak perlu menulis kode apa pun atau mengambil tindakan lain ketika telah dikonfigurasi untuk database.

Pencerminan database, yang diimplementasikan per database, menyimpan salinan database produksi SQL Server di server siaga. Server ini adalah server siaga panas atau hangat, tergantung pada konfigurasi dan keadaan sesi pencerminan basis data. Server siaga panas mendukung failover cepat tanpa kehilangan transaksi yang dilakukan. Server siaga hangat mendukung layanan memaksa (dengan kemungkinan kehilangan data).

Database produksi disebut database utama , dan salinan siaga disebut database cermin . Database utama dan database cermin harus berada di instans terpisah SQL Server (instans server). Mereka harus berada di komputer terpisah, jika memungkinkan.

Instans server produksi (server utama) berkomunikasi dengan instans server siaga (server cermin). Server utama dan server cermin bertindak sebagai mitra dalam sesi pencerminan basis data. Jika server utama gagal, server cermin dapat menjadikan databasenya sebagai database utama melalui proses yang disebut failover. Misalnya, Partner_A dan Partner_B adalah dua server mitra, dengan database utama awalnya pada Partner_A sebagai server utama, dan database cermin berada di Partner_B sebagai server cermin. Jika Partner_A menjadi offline, database di Partner_B dapat melakukan failover untuk menjadi database principal yang aktif saat ini. Ketika Partner_A bergabung kembali dengan sesi pencerminan, Partner_A menjadi server cermin dan basis datanya menjadi basis data cermin.

Jika server Partner_A rusak secara tidak dapat diperbaiki, server Partner_C dapat dibawa online untuk bertindak sebagai server cermin untuk Partner_B, yang sekarang menjadi server utama. Namun, dalam skenario ini, aplikasi klien harus menyertakan logika pemrograman untuk memastikan bahwa properti string koneksi diperbarui dengan nama server baru yang digunakan dalam konfigurasi pencerminan database. Jika tidak, koneksi ke server mungkin gagal.

Konfigurasi pencerminan database alternatif menawarkan tingkat performa dan keamanan data yang berbeda, dan mendukung berbagai bentuk failover. Untuk informasi selengkapnya, lihat "Gambaran Umum Pencerminan Database" di SQL Server Books Online.

Pertimbangan pemrograman

Ketika server database utama gagal, aplikasi klien menerima kesalahan sebagai respons terhadap panggilan API, yang menunjukkan bahwa koneksi ke database telah hilang. Ketika kesalahan ini terjadi, setiap perubahan yang tidak dilakukan pada database hilang dan transaksi saat ini digulung balik. Dalam skenario ini, aplikasi harus menutup koneksi (atau merilis objek sumber data) dan mencoba membukanya kembali. Pada koneksi, koneksi baru secara transparan dialihkan ke database cermin, yang sekarang bertindak sebagai server utama, tanpa klien harus memodifikasi string koneksi atau objek sumber data.

Ketika koneksi awalnya dibuat, server utama mengirimkan identitas mitra failover-nya ke klien yang akan digunakan ketika failover terjadi. Ketika aplikasi mencoba membuat koneksi awal dengan server utama yang gagal, klien tidak tahu identitas mitra failover. Untuk memberi klien kesempatan untuk mengatasi skenario ini, properti string koneksi failoverPartner dan, secara opsional, metode sumber data setFailoverPartner memungkinkan klien untuk menentukan sendiri identitas mitra failover tersebut. Properti klien hanya digunakan dalam skenario ini; jika server utama tersedia, server tersebut tidak digunakan.

Catatan

Ketika failoverPartner ditetapkan baik dalam string koneksi maupun melalui objek sumber data, properti databaseName juga harus ditetapkan; jika tidak, pengecualian akan dimunculkan. Jika failoverPartner dan databaseName tidak ditentukan secara eksplisit, aplikasi tidak akan mencoba failover ketika server database utama gagal. Dengan kata lain, pengalihan transparan hanya berfungsi untuk koneksi yang secara eksplisit menentukan failoverPartner dan databaseName. Untuk informasi selengkapnya tentang failoverPartner dan properti string koneksi lainnya, lihat Mengatur properti koneksi.

Jika server mitra failover yang disediakan oleh klien tidak merujuk ke server yang bertindak sebagai mitra failover untuk database yang ditentukan, dan jika server/database yang dimaksud berada dalam pengaturan cermin, koneksi ditolak oleh server. Meskipun kelas SQLServerDataSource menyediakan metode getFailoverPartner, metode ini hanya mengembalikan nama mitra failover yang ditentukan dalam metode string koneksi atau setFailoverPartner. Untuk mengambil nama mitra failover aktual yang saat ini sedang digunakan, gunakan pernyataan Transact-SQL berikut:

SELECT m.mirroring_role_DESC, m.mirroring_state_DESC,
m.mirroring_partner_instance FROM sys.databases as db,
sys.database_mirroring AS m WHERE db.name = 'MirroringDBName'
AND db.database_id = m.database_id

Catatan

Anda perlu mengubah pernyataan ini agar menggunakan nama database mirror Anda.

Pertimbangkan untuk membuat cache informasi mitra untuk memperbarui string koneksi atau menyusun strategi coba lagi jika upaya pertama untuk membuat koneksi gagal.

Contoh

Dalam contoh berikut, upaya pertama kali dilakukan untuk terhubung ke server prinsip. Jika hal itu gagal dan terjadi pengecualian, sistem akan mencoba terhubung ke server cermin, yang mungkin telah dijadikan server utama yang baru. Perhatikan penggunaan properti failoverPartner di string koneksi.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class ClientFailover {
    public static void main(String[] args) {

        String connectionUrl = "jdbc:sqlserver://serverA:1433;"
                + "encrypt=true;databaseName=AdventureWorks;integratedSecurity=true;"
                + "failoverPartner=serverB";

        // Establish the connection to the principal server.
        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement();) {
            System.out.println("Connected to the principal server.");

            // Note that if a failover of serverA occurs here, then an
            // exception will be thrown and the failover partner will
            // be used in the first catch block below.

            // Execute a SQL statement that inserts some data.

            // Note that the following statement assumes that the
            // TestTable table has been created in the AdventureWorks
            // sample database.
            stmt.executeUpdate("INSERT INTO TestTable (Col2, Col3) VALUES ('a', 10)");
        }
        catch (SQLException se) {
            System.out.println("Connection to principal server failed, " + "trying the mirror server.");
            // The connection to the principal server failed,
            // try the mirror server which may now be the new
            // principal server.
            try (Connection con = DriverManager.getConnection(connectionUrl);
                    Statement stmt = con.createStatement();) {
                System.out.println("Connected to the new principal server.");
                stmt.executeUpdate("INSERT INTO TestTable (Col2, Col3) VALUES ('a', 10)");
            }
            // Handle any errors that may have occurred.
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}