Menggunakan pencerminan database (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 status sesi pencerminan database. 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 cermin bertindak sebagai mitra dalam sesi pencerminan database. 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 offline, database di Partner_B dapat gagal untuk menjadi database utama saat ini. Ketika Partner_A bergabung kembali dengan sesi pencerminan, itu menjadi server cermin dan databasenya menjadi database 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 memungkinkan klien kesempatan untuk mengatasi skenario ini, properti failoverPartner string koneksi, dan secara opsional metode sumber data setFailoverPartner, memungkinkan klien untuk menentukan identitas mitra failover sendiri. Properti klien hanya digunakan dalam skenario ini; jika server utama tersedia, server tersebut tidak digunakan.
Catatan
Ketika failoverPartner ditentukan di string koneksi atau dengan objek sumber data, properti databaseName juga harus diatur atau pengecualian akan dilemparkan. 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 harus mengubah pernyataan ini untuk menggunakan nama database pencerminan 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 itu gagal dan pengecualian dilemparkan, upaya dilakukan untuk terhubung ke server cermin, yang mungkin telah dipromosikan ke server prinsip 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();
}
}
}
}