Viele Pooling-Bibliotheken für Datenbankverbindungen bieten die Möglichkeit, ihre SQL-Verbindungen auf Leerlauf zu testen. Beispielsweise verfügt die JDBC- Poolbibliothek c3p0 über eine Eigenschaft namens preferredTestQuery
, die in konfigurierten Intervallen für die Verbindung ausgeführt wird. Ebenso hat Apache Commons DBCP validationQuery
.
Viele Beispiel Abfragen Ich habe gesehen , sind für MySQL und empfehlen die Verwendung SELECT 1;
als Wert für die Testabfrage. Diese Abfrage funktioniert jedoch nicht in einigen Datenbanken (z. B. HSQLDB, für die SELECT 1
eine FROM
Klausel erwartet wird ).
Gibt es eine datenbankunabhängige Abfrage, die gleich effizient ist, aber für alle SQL-Datenbanken funktioniert?
Bearbeiten:
Wenn dies nicht der Fall ist (was anscheinend der Fall ist), kann jemand eine Reihe von SQL-Abfragen vorschlagen, die für verschiedene Datenbankanbieter funktionieren? Meine Absicht wäre es, programmgesteuert eine Anweisung zu bestimmen, die ich basierend auf der Konfiguration meines Datenbankanbieters verwenden kann.
quelle
Antworten:
Nach ein wenig Recherche und Hilfe von einigen der Antworten hier:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
oder
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (getestet mit Version 1.8.0.10)
Hinweis: Ich habe versucht, eine
WHERE 1=0
Klausel für die zweite Abfrage zu verwenden, diese hat jedoch nicht als Wert für Apache Commons-DBCPsvalidationQuery
funktioniert, da die Abfrage keine Zeilen zurückgibtVALUES 1
oderSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
quelle
VALUES 1
undSELECT 1 FROM SYSIBM.SYSDUMMY1
für Apache DerbyWenn Ihr Treiber JDBC 4-kompatibel ist, ist keine dedizierte Abfrage zum Testen von Verbindungen erforderlich. Stattdessen gibt es Connection.isValid , um die Verbindung zu testen.
JDBC 4 ist Teil von Java 6 aus dem Jahr 2006 und Ihr Treiber sollte dies jetzt unterstützen!
Berühmte Verbindungspools wie HikariCP verfügen weiterhin über einen Konfigurationsparameter zum Angeben einer Testabfrage, raten jedoch dringend davon ab, diese zu verwenden:
quelle
Leider gibt es keine SELECT-Anweisung, die unabhängig von der Datenbank immer funktioniert.
Die meisten Datenbanken unterstützen:
Einige Datenbanken unterstützen dies nicht, haben jedoch eine Tabelle namens DUAL, die Sie verwenden können, wenn Sie keine Tabelle benötigen:
MySQL unterstützt dies auch aus Kompatibilitätsgründen, jedoch nicht alle Datenbanken. Eine Problemumgehung für Datenbanken, die keines der oben genannten Verfahren unterstützen, besteht darin, eine Tabelle mit dem Namen DUAL zu erstellen, die eine einzelne Zeile enthält. Dann funktioniert das oben Gesagte.
HSQLDB unterstützt keines der oben genannten Verfahren, sodass Sie entweder die DUAL-Tabelle erstellen oder Folgendes verwenden können:
quelle
SELECT 1 FROM DUAL
funktioniert auch nicht mit HSQLDB.Ich benutze dieses:
um die Verbindung und die Fähigkeit zu überprüfen, Abfragen (mit 1 Zeile als Ergebnis) für postgreSQL, MySQL und MSSQL auszuführen.
quelle
ich benutze
für hsqldb 1.8.0
quelle
Bei Tests mit
select count(*)
sollte die Verwendung effizienter sein,select count(1)
da*
dadurch alle Spaltendaten gelesen werden können.quelle
select 1
würde in SQL Server funktionieren, nicht sicher über die anderen.Verwenden Sie Standard-Ansi-SQL, um eine Tabelle zu erstellen und dann von dieser Tabelle abzufragen.
quelle
create table
?Angenommen, das OP möchte eine Java-Antwort:
Ab JDBC3 / Java 6 gibt es die Methode isValid () , die verwendet werden sollte, anstatt die eigene Methode zu erfinden.
Der Implementierer des Treibers muss eine Art Abfrage für die Datenbank ausführen, wenn diese Methoden-ID aufgerufen wird. Sie als reiner JDBC-Benutzer müssen nicht wissen oder verstehen, was diese Abfrage ist. Sie müssen lediglich darauf vertrauen, dass der Ersteller des JDBC-Treibers seine Arbeit ordnungsgemäß ausgeführt hat.
quelle
Wie wäre es mit
Ich benutze dies vorher. MySQL, H2 ist in Ordnung, ich kenne andere nicht.
quelle
Ich habe gerade herausgefunden, wie schwierig es ist
auch für MaxDB.
quelle
Für Oracle ist die leistungsstarke Abfrage
Dies ist aus Sicht der Leistung.
quelle
Ich benutze dies für Firebird
quelle
Für MSSQL .
Dies half mir festzustellen, ob Verbindungsserver am Leben waren. Verwenden einer Open Query-Verbindung und eines TRY CATCH, um die Ergebnisse des Fehlers auf etwas Nützliches zu übertragen.
docs.microsoft.com
quelle