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.

Was haben Sie gegen die ready-made-connection-pools, dem überprüfen der verbindungen als eine Frage der routine?
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

Schreibe einen Kommentar