Effiziente SQL-Testabfrage oder -validierungsabfrage, die in allen (oder den meisten) Datenbanken funktioniert
Viele Datenbank-connection-pooling-Bibliotheken bieten die Möglichkeit, testen Sie Ihre SQL-verbindungen für Müßiggang. Zum Beispiel, die JDBC-pooling-Bibliothek c3p0 hat eine Eigenschaft namens preferredTestQuery
, die ausgeführt wird auf die Verbindung konfigurierten Intervallen. Ähnlich, Apache Commons DBCP hat validationQuery
.
Viele Beispiel Abfragen ich gesehen habe, sind für MySQL und empfehlen die Verwendung SELECT 1;
als Wert für den test Abfrage. Aber diese Abfrage funktioniert nicht auf einige Datenbanken (z.B. HSQLDB, für die SELECT 1
erwartet eine FROM
- Klausel).
Ist es eine Datenbank-unabhängige Abfrage, ist gleichbedeutend mit effizienter, aber für alle SQL-Datenbanken?
Edit:
Wenn es nicht (was der Fall zu sein scheint), kann jemand empfehlen, einen Satz von SQL-Abfragen, die die Arbeit für verschiedene Datenbank-Anbieter? Meine Absicht wäre, programmgesteuert bestimmen, eine Aussage, die ich verwenden können, basierend auf meinen Datenbank-provider-Konfiguration.
InformationsquelleAutor der Frage Rob Hruska | 2010-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach ein wenig Forschung zusammen mit der 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, mit einem
WHERE 1=0
- Klausel, die auf die zweite Abfrage, aber es hat nicht funktioniert, als Wert für Apache Commons DBCP istvalidationQuery
, da die Abfrage nicht alle ZeilenVALUES 1
oderSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
InformationsquelleAutor der Antwort Rob Hruska
Wenn Ihr Treiber JDBC-4 kompatibel, es gibt keine Notwendigkeit für eine dedizierte Abfrage zu testen verbindungen. Statt dessen gibt es - Verbindung.isValid um die Verbindung zu testen.
JDBC 4 ist Teil von Java 6 aus dem Jahr 2006 und Sie Treiber sollte unterstützt dies, indem jetzt!
Berühmten Verbindungs-pools, wie HikariCP, haben noch einen config-parameter für die Angabe einer test-Abfrage aber dringend davon abgeraten, es zu benutzen:
InformationsquelleAutor der Antwort Tim Büthe
Leider gibt es keine SELECT-Anweisung, funktioniert immer, unabhängig von der Datenbank.
Meisten Datenbanken-Unterstützung:
Einige Datenbanken bieten HIERFÜR keine Unterstützung, sondern haben eine Tabelle namens DUAL, die Sie verwenden können, wenn Sie nicht brauchen eine Tabelle:
MySQL unterstützt auch dieses aus Gründen der Kompatibilität, aber nicht alle Datenbanken tun. Ein workaround für Datenbanken, die keine Unterstützung entweder von den oben genannten ist das erstellen einer Tabelle DUAL, die eine einzelne Zeile enthält, dann die oben genannten arbeiten.
HSQLDB unterstützt keine der oben genannten, so können Sie entweder die DUAL-Tabelle oder anderes verwenden:
InformationsquelleAutor der Antwort Mark Byers
Benutze ich diese:
prüfen Verbindung und die Fähigkeit zum ausführen von Abfragen (mit 1 Zeile als Ergebnis) für postgreSQL, MySQL und MSSQL.
InformationsquelleAutor der Antwort Wojciechk
Für tests mit
select count(*)
sollte es sein, effizienter zu nutzenselect count(1)
weil*
dazu führen, dass es alle Lesen die Spalte Daten.InformationsquelleAutor der Antwort NateN
select 1
wäre in sql server, nicht sicher über die anderen.Verwenden standard ansi-sql auf eine Tabelle erstellen und dann die Abfrage aus dieser Tabelle.
InformationsquelleAutor der Antwort NimChimpsky
Benutze ich
für hsqldb 1.8.0
InformationsquelleAutor der Antwort thinkbase
Vorausgesetzt, der OP will ein Java-Antwort:
Als der JDBC3 /Java 6 gibt es die isValid() Methode, die verwendet werden sollten, anstatt zu erfinden, eine eigene Methode.
Die Umsetzer der Treiber erforderlich ist, um die Ausführung mancher Art der Abfrage gegen die Datenbank, wenn diese Methode id genannt. Sie - als bloße JDBC-Benutzer nicht wissen oder verstehen, was diese Abfrage ist. Alles, was Sie tun müssen, ist, darauf zu Vertrauen, dass der Schöpfer des JDBC-Treibers getan hat, seine/Ihre Arbeit richtig.
InformationsquelleAutor der Antwort peterh
Wie etwa
Ich diese vor.MySQL, H2 ist OK, ich weiß nicht, andere.
InformationsquelleAutor der Antwort wener
Gerade herausgefunden, die harte Tour, dass es
für MaxDB als gut.
InformationsquelleAutor der Antwort Lars Decker
Ich benutze diese für Firebird
InformationsquelleAutor der Antwort claudsan
Für MSSQL.
Dies hat mir geholfen, festzustellen, ob verknüpfte Server am Leben waren. Mit einer Geöffneten Abfrage-Anschluss und ein TRY CATCH um die Ergebnisse der Fehler zu etwas nützlich.
docs.microsoft.com
InformationsquelleAutor der Antwort DeFlanko