Ketahanan koneksi (JDBC)

Unduh driver JDBC

Ketahanan koneksi memungkinkan driver JDBC memulihkan koneksi diam yang rusak secara transparan dan mencoba kembali koneksi awal jika gagal. Artikel ini membahas dua properti string koneksi yang mengontrol perilaku ini (connectRetryCount dan connectRetryInterval) dan pengaturan keepalive yang digunakan driver untuk mendeteksi koneksi diam yang terputus. Ketahanan koneksi tersedia dimulai dengan Microsoft JDBC Driver 10.2.0 untuk SQL Server. Menghubungkan kembali koneksi idle yang rusak memerlukan SQL Server 2014 dan versi yang lebih baru, atau Azure SQL Database.

Tip

Resiliensi koneksi hanya mencoba ulang koneksi awal dan secara otomatis memulihkan koneksi idle yang terputus. Untuk mencoba kembali pernyataan yang gagal secara otomatis (misalnya, korban kebuntuan 1205 atau batas waktu kunci 1222), atau untuk memperpanjang daftar coba lagi koneksi dengan nomor kesalahan kustom (misalnya, Azure SQL kesalahan sementara seperti 40197 atau 40613), gunakan logika coba lagi yang dapat dikonfigurasi. CRL adalah sistem berbasis aturan, Anda memilih kesalahan-kesalahan dan backoff, dan CRL bekerja bersama fitur-fitur dalam artikel ini.

Cara driver JDBC melakukan percobaan ulang

Driver JDBC menyediakan tiga mekanisme coba lagi independen. Mereka bekerja sama, sehingga Anda dapat menggunakan semuanya sekaligus:

Mekanisme Apa fungsinya Tempat mempelajari lebih lanjut
Ketahanan koneksi tidak aktif Memulihkan secara transparan koneksi yang idle dan rusak (misalnya, koneksi dalam pool yang ditutup oleh server atau load balancer). Mendeteksi koneksi diam yang rusak (artikel ini)
Coba lagi koneksi awal Mencoba kembali koneksi awal yang gagal pada jadwal tetap untuk daftar kesalahan sementara bawaan. Coba lagi koneksi awal (artikel ini)
Logika percobaan ulang yang dapat dikonfigurasi (CRL) Percobaan ulang berbasis aturan untuk pernyataan yang gagal dan untuk nomor kesalahan khusus. Diperkenalkan dalam Microsoft JDBC Driver 12.10. Logika coba lagi yang dapat dikonfigurasi

Coba lagi koneksi awal

Driver JDBC mencakup dua properti koneksi yang mengontrol seberapa sering dan berapa lama driver menunggu sebelum mencoba kembali koneksi awal. Tambahkan properti ini ke string koneksi atau atur melalui properti sumber data.

Kata kunci Nilai Bawaan Deskripsi
connectRetryCount Bilangan bulat antara 0 dan 255 (inklusif) 1 Jumlah maksimum upaya untuk membuat atau membangun kembali koneksi sebelum menyerah. Secara default, driver melakukan satu upaya coba lagi. Nilai 0 menonaktifkan percobaan ulang.
connectRetryInterval Bilangan bulat antara 1 dan 60 (inklusif) 10 Waktu, dalam detik, antara percobaan ulang koneksi. Driver mencoba untuk segera terhubung kembali ketika mendeteksi koneksi diam yang rusak, lalu menunggu connectRetryInterval detik sebelum mencoba lagi. Properti ini diabaikan ketika connectRetryCount adalah 0.

Pengemudi langsung menjalankan percobaan ulang pertama dan menunggu connectRetryInterval beberapa detik sebelum percobaan berikutnya, jadi connectRetryCount percobaan ulang berlangsung sekitar detik (connectRetryCount - 1) * connectRetryInterval . loginTimeout membatasi keseluruhan urutan: driver berhenti melakukan percobaan ulang setelah waktu yang telah berlalu ditambah connectRetryInterval mencapai loginTimeout, yang terjadi satu interval sebelum loginTimeout itu sendiri.

Properti ini hanya mencoba ulang daftar bawaan kesalahan koneksi sementara. Untuk daftar lengkap kesalahan yang tercakup (4060, 40197, 40501, 40613, 49918-49920, dan lainnya), lihat Daftar kesalahan koneksi sementara bawaan. Untuk menambahkan nomor kesalahan kustom ke set ini, atau ganti sepenuhnya, gunakan retryConn dalam logika coba lagi yang dapat dikonfigurasi. Untuk mencoba kembali pernyataan yang gagal, gunakan retryExec di artikel yang sama.

Caution

Jika Anda menetapkan retryConn tanpa + di awal, itu menggantikan daftar bawaan alih-alih memperluasnya. Setiap kesalahan bawaan yang tidak Anda cantumkan sendiri, termasuk 40613, tidak akan dicoba ulang.

Tetapkan properti

Atur connectRetryCount dan connectRetryInterval di URL JDBC, pada Properties objek, atau pada SQLServerDataSource.

Di URL JDBC:

jdbc:sqlserver://server;databaseName=db;connectRetryCount=3;connectRetryInterval=10

Dengan objek Properties. Potongan kode Java dalam artikel ini tidak menyertakan pernyataan impor dan deklarasi kelas pembungkus demi keringkasan.

Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("connectRetryCount", "3");
props.setProperty("connectRetryInterval", "10");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);

Dengan SQLServerDataSource:

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setUser("...");
ds.setPassword("...");
ds.setConnectRetryCount(3);
ds.setConnectRetryInterval(10);

Terhubung ke database serverless yang dijeda secara otomatis

Saat Anda menggunakan Azure SQL Database tanpa server dengan auto-pause diaktifkan, database akan dilanjutkan pada percobaan koneksi pertama. Upaya tersebut gagal dengan error 40613 saat resume berjalan. Basis data umumnya kembali aktif dalam waktu kurang dari satu menit. Untuk informasi lebih lanjut, lihat Auto-pause dan auto-resume.

Kesalahan 40613 ada di daftar kesalahan koneksi transien bawaan, jadi driver mencoba kembali koneksi tersebut. Aplikasi Anda tidak memerlukan loop percobaan ulang sendiri untuk kasus ini. Pengaturan bawaan tidak mendukung pelanjutan: connectRetryCount is 1, dan driver segera menjalankan satu kali percobaan ulang tersebut. Kedua percobaan terjadi saat database masih dilanjutkan, sehingga aplikasi melihat kesalahan tersebut.

Untuk menangani resume, atur ketiga properti tersebut bersama-sama:

Property Mengapa penting
connectRetryCount Mengatur jumlah percobaan ulang yang tersedia untuk Anda. Atur ke nilai yang lebih tinggi daripada nilai default 1.
connectRetryInterval Mengatur jarak untuk percobaan ulang. Percobaan ulang pertama dilakukan segera; pengemudi menunggu selama ini sebelum setiap percobaan berikutnya.
loginTimeout Membatasi seluruh urutan. Driver berhenti mencoba ulang setelah waktu yang telah berlalu ditambah connectRetryInterval mencapai loginTimeout.

Nilai-nilai berikut terus mencoba ulang selama sekitar satu menit, yang mencakup resume tipikal:

jdbc:sqlserver://<server>.database.windows.net;databaseName=<database>;encrypt=true;loginTimeout=120;connectRetryCount=5;connectRetryInterval=15

Menaikkan loginTimeout sendiri tidak membantu, karena upaya koneksi gagal dengan cepat dengan 40613 daripada tergantung. Menaikkan connectRetryCount saja juga tidak membantu, karena loginTimeout mempersingkat urutannya.

Deteksi koneksi tidak aktif yang rusak

Koneksi diam yang khas adalah koneksi yang berada di kumpulan koneksi. Driver menganggap koneksi sebagai tidak aktif setelah sekitar 30 detik tanpa aktivitas. Server atau perangkat jaringan di antara klien dan server dapat menutup koneksi yang menganggur, sehingga driver memerlukan cara untuk mendeteksi bahwa soket sudah tidak aktif sebelum kueri berikutnya dijalankan.

Untuk mendeteksi koneksi idle yang rusak, driver mengandalkan paket TCP keepalive pada tingkat soket. Di Linux dengan Java 11 dan versi yang lebih baru, driver secara otomatis mengaktifkan paket keepalive dengan interval 30 detik (KeepAliveTime), dengan jeda 1 detik antara percobaan ulang saat terjadi kegagalan (KeepAliveInterval).

Penting

Di Windows dan Java 11 atau versi yang lebih lama, Anda harus mengonfigurasi keepalive secara manual di sistem operasi untuk memanfaatkan pemulihan koneksi idle yang terputus. Untuk informasi tentang cara mengonfigurasi keepalives, lihat Koneksi ke database Azure SQL.

Batasan

Driver tidak dapat memulihkan koneksi idle yang rusak jika salah satu kondisi berikut terpenuhi:

  • Ada kumpulan hasil terbuka yang tidak sepenuhnya diurai atau di-buffer.
  • Koneksi beralih database terhadap Azure SQL.
  • Ada transaksi terbuka.