Banyak perpustakaan kumpulan koneksi database menyediakan kemampuan untuk menguji koneksi SQL mereka untuk kemalasan. Sebagai contoh, perpustakaan pooling JDBC c3p0 memiliki properti bernama preferredTestQuery
, yang dieksekusi pada koneksi pada interval yang dikonfigurasi. Demikian pula, Apache Commons DBCP memiliki validationQuery
.
Banyak contoh kueri yang saya lihat adalah untuk MySQL dan merekomendasikan penggunaan SELECT 1;
sebagai nilai untuk kueri pengujian. Namun, kueri ini tidak berfungsi pada beberapa database (misalnya HSQLDB, yang SELECT 1
mengharapkan FROM
klausa).
Apakah ada query database-agnostik yang setara efisien tetapi akan bekerja untuk semua database SQL?
Edit:
Jika tidak ada (yang tampaknya demikian), dapatkah seseorang menyarankan satu set query SQL yang akan bekerja untuk berbagai penyedia database? Niat saya adalah untuk secara programatik menentukan pernyataan yang dapat saya gunakan berdasarkan konfigurasi penyedia basis data saya.
sumber
Jawaban:
Setelah sedikit riset bersama dengan bantuan dari beberapa jawaban di sini:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
atau
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (diuji dengan versi 1.8.0.10)
Catatan: Saya mencoba menggunakan
WHERE 1=0
klausa pada kueri kedua, tetapi itu tidak berfungsi sebagai nilai untuk Apache Commons DBCPvalidationQuery
, karena kueri tidak mengembalikan baris apa punVALUES 1
atauSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
sumber
VALUES 1
danSELECT 1 FROM SYSIBM.SYSDUMMY1
untuk Apache DerbyJika driver Anda sesuai dengan JDBC 4, tidak perlu permintaan khusus untuk menguji koneksi. Sebaliknya, ada Connection.isValid untuk menguji koneksi.
JDBC 4 adalah bagian dari Java 6 dari 2006 dan driver Anda harus mendukung ini sekarang!
Kumpulan koneksi terkenal, seperti HikariCP, masih memiliki parameter konfigurasi untuk menentukan kueri pengujian tetapi sangat tidak disarankan untuk menggunakannya:
sumber
Sayangnya tidak ada pernyataan SELECT yang akan selalu berfungsi terlepas dari basis data.
Sebagian besar basis data mendukung:
Beberapa database tidak mendukung ini tetapi memiliki tabel yang disebut DUAL yang dapat Anda gunakan saat Anda tidak membutuhkan tabel:
MySQL juga mendukung ini untuk alasan kompatibilitas, tetapi tidak semua database melakukannya. Solusi untuk database yang tidak mendukung salah satu di atas adalah membuat tabel yang disebut DUAL yang berisi satu baris, maka yang di atas akan berfungsi.
HSQLDB tidak mendukung hal di atas, sehingga Anda bisa membuat tabel DUAL atau menggunakan:
sumber
SELECT 1 FROM DUAL
juga tidak bekerja dengan HSQLDB.Saya menggunakan ini:
untuk memeriksa koneksi dan kemampuan untuk menjalankan query (dengan 1 baris sebagai hasilnya) untuk postgreSQL, MySQL dan MSSQL.
sumber
saya menggunakan
untuk hsqldb 1.8.0
sumber
Untuk tes yang menggunakan
select count(*)
, harus lebih efisien untuk digunakanselect count(1)
karena*
dapat menyebabkannya membaca semua data kolom.sumber
select 1
akan bekerja di server sql, tidak yakin tentang yang lain.Gunakan sql ansi standar untuk membuat tabel dan kemudian kueri dari tabel itu.
sumber
create table
?Dengan asumsi OP menginginkan jawaban Java:
Pada JDBC3 / Java 6 ada isValid () yang harus digunakan daripada menciptakan metode sendiri.
Implementer driver diperlukan untuk mengeksekusi semacam query terhadap database ketika metode ini dipanggil. Anda - sebagai pengguna JDBC belaka - tidak harus tahu atau mengerti apa permintaan ini. Yang harus Anda lakukan adalah percaya bahwa pencipta driver JDBC telah melakukan pekerjaannya dengan benar.
sumber
Bagaimana tentang
Saya menggunakan ini sebelumnya. MySQL, H2 tidak apa-apa, saya tidak tahu yang lain.
sumber
Baru tahu betapa sulitnya itu
untuk MaxDB juga.
sumber
Untuk Oracle, permintaan berkinerja tinggi adalah
Ini dari perspektif kinerja.
sumber
Saya menggunakan ini untuk Firebird
sumber
Untuk MSSQL .
Ini membantu saya menentukan apakah server yang ditautkan masih hidup. Menggunakan koneksi Open Query dan TRY CATCH untuk menempatkan hasil kesalahan pada sesuatu yang bermanfaat.
docs.microsoft.com
sumber