Gibt es einen sicheren Weg, zu sagen, wenn eine JDBC-Verbindung noch ok ist?
Wir haben ein web-server die Verarbeitung von Anforderungen von clients. Ein Baustein dieser web-server über eine Verbindung zu einer Datenbank.
Ich muss in der Lage sein, zu erkennen, wenn die Verbindung geschlossen wurde oder in irgendeiner Weise nicht mehr funktionsfähig sind, bevor ich beginne, es zu benutzen. Derzeit mache ich so etwas wie:
//Decide connection details on alias.
private String alias = null;
//I must have my own because I prepare statements.
private Connection connection = null;
public Connection getConnection() {
try {
if ( connection.isClosed() ) {
//Start afresh.
connection = null;
}
//** More tests here to check connection is ok.
if (connection == null) {
//Make a new connection.
connection = Connections.getConnection(alias);
}
} catch (SQLException ex) {
//Cause a NPE further down the line.
connection = null;
}
return connection;
}
Leider wird das auch mal wieder so eine veraltete Verbindung, die bekomme ich von verschiedenen Fehlern. Eine solche sieht wie folgt aus:
java.sql.SQLException: Io exception: Software verursacht connection abort: socket write error
Beachten Sie, dass dies nur ein Fehler erfasst, und dies geschieht nach etwa 72 Stunden im Leerlauf.
Was ich Suche, ist eine minimale Datenbank-generic-tester einer Verbindung, sollte konsequent sagen, wenn die Verbindung aufgebaut ist, stabil ausgeführt. Ist das möglich?
Ich nicht Verstand läuft eine sehr kleine Abfrage, aber es muss sein, beides, Datenbank-agnostisch und nehmen wenig bis gar keine Zeit/Ressourcen.
BTW: bei mir läuft unter Java 5 so Connection.isValid
ist keine Lösung für mich.
Hinzugefügt
Für diejenigen von Euch, die den Besuch dieser Frage später, ich schließlich nahm der Beratung und wechselte zu einem echten Verbindungs-pool-und das war nicht nur erstaunlich einfach zu tun, aber alle meine Probleme verschwunden.
Der einzige seltsame Teil war die Erkenntnis, dass mit einem connection pool müssen Sie close
Ihre Verbindung, wenn Sie mit ihm fertig sind - der pool fängt die enge und gibt es zurück an den pool, hinter den kulissen.
nichts - als solche - aber ich habe Anweisungen vorbereitet, die an diesen verbindungen, so ich Sie mich behandeln. Oder mache ich das?
Eigentlich ist das ein Anliegen, dass diese Becken auch behandeln, mit prepared statement pools. BTW, meine Wahl wäre boneCP.
Ja, ein anständiger pool sollte übernehmen das für Sie. Dein code mir vorgeschlagen, dass Sie sich entschieden haben, es alleine zu machen und es selbst tun.
InformationsquelleAutor OldCurmudgeon | 2013-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg ist, um einen einfachen SQL-Anweisung, wie
SELECT 1
oderSELECT 1 FROM DUAL
für Oracle. (Bitte sehen Sie Ihre Datenbank für Hersteller-spezifische syntax.)Falls dies nicht funktioniert, aktualisieren Sie die Verbindung. Das ist, was Java EE app-Servern wie WebLogic tun, um Sie zu testen, ob Sie so konfigurieren, dass Sie tun so.
Erledigt - danke.
Wird
SELECT 1
Arbeit gegen alle Datenbanken?Es funktioniert nicht auf Informix, Oracle oder DB2. Habe es gerade ausprobiert. 🙂
Ich werde sicherlich benötigen entweder eine Oracle-version oder eine, die funktioniert auch mit Oracle.
SELECT 1 FROM DUAL
scheint ein guter Vorschlag für Oracle, aber ich würde lieber nur eine, die allumfassend ist.InformationsquelleAutor duffymo
Versuchen
Gibt true zurück, wenn die Verbindung wurde nicht geschlossen und ist auch heute noch gültig.
Nur ein bisschen mehr info, meines Wissens, die
java.sql.Connection.isValid(int timeout)
MethodenaufrufeSELECT 1
InformationsquelleAutor Evgeniy Dorofeev
Jede Datenbank eine Abfrage, hängt nicht von vorhandenen Tabellen. Für Oracle, versuchen
Für viele andere Datenbanken (MySQL, H2), versuchen
DB2 hat seine eigene, eindeutige syntax:
DB2 verwendet die folgende syntax zum erstellen von ad-hoc-Tabellen aus einer Liste von Werten. Suchen Sie in der Dokumentation für
VALUES statement
.Danke, aber ich glaube nicht, verwenden Sie DB2 (Gott sei Dank).
InformationsquelleAutor Aaron Digulla
Im meinem Fall, verwende ich java.sql.- Verbindung.isValid(int timeout) :
Habe ich eine Methode getConnection (oder getInstance keine Umfrage in diesem Beispiel) :
isValid
ist nur verfügbar, in Java 1.6 umgestellt. Insgesamt - mein Rat wäre, gehen Sie für einen connection pool.InformationsquelleAutor Javathought