6 Stimmen

programmatische Prüfung auf offene Verbindung in JDBC

Wie prüfe ich eine offene Verbindung in jdbc for oracle database?

Anmerkung: conn.isClosed() kann hierfür nicht verwendet werden.

0 Stimmen

Möchten Sie wissen, ob Ihre Anwendung eine Verbindung geöffnet hat, oder möchten Sie wissen, ob die DB eine Verbindung zu irgendetwas geöffnet hat.

0 Stimmen

Ich möchte einen Verbindungspool einrichten.

0 Stimmen

8voto

RealHowTo Punkte 33858

Etwa so:

Statement stmt = null;
ResultSet rs =null;
try {
   stmt = conn.createStatement();
   // oracle
   rs = stmt.executeQuery("SELECT 1 FROM Dual");
   // others
   // rs = stmt.executeQuery("SELECT 1");
   if (rs.next())
      return true; // connection is valid
}
catch (SQLException e) {
   // TODO : log the exception ...
   return false;
}
finally {
   if (stmt != null) stmt.close();
   if (rs != null) rs.close();
} 

Wenn die Verbindung von einem Verbindungspool (z. B. in einem Anwendungsserver) kommt, verfügt der Pool möglicherweise über einen Mechanismus zur Überprüfung, ob eine Verbindung gültig ist oder nicht. Bei BEA geben Sie das SELECT in der Eigenschaft "test-on-reserve" an.

Wenn Sie Ihren eigenen Pool entwickeln, sollten Sie sich ansehen, wie andere dies tun (z. B. Proxool ).

0 Stimmen

Je nach Ihrer Umgebung SOLLTE Ihr Connection Pool die Verbindung prüfen. Andernfalls müssen Sie, wenn Sie die Verbindung zur DB verlieren, in der Regel Ihren Anwendungsserver neu starten, um den Pool neu zu starten.

0 Stimmen

Ich vermute stark, dass die executeQuery eine SQLException auslösen wird, wenn die Verbindung geschlossen wird.

2voto

reallyinsane Punkte 1122

Normalerweise verwendet ein Connection Pool auch die Methode Connection.isClosed(), um zu prüfen, ob die Verbindung noch gültig ist. Das Problem ist, dass nicht alle JDBC-Treiber diesen Aufruf korrekt verarbeiten. Daher nehme ich an, dass es einige einfache Prüfanweisungen gibt, wie RealHowTo sagte. Für Oracle hat er bereits das "SELECT 1 FROM Dual" erwähnt, das bei Oracle-Datenbanken immer erfolgreich sein sollte. Ich denke, dass es ähnliche Abfragen für die verschiedenen Datenbanken gibt. Ich kann mich erinnern, dass wir in einem früheren Projekt auch einen eigenen Connection Pool implementiert haben, der solche Validierungsabfragen verwendet hat.

1voto

Nicholas Punkte 15611

Ver este Buchung.

Die referenzierten Lösungen ähneln der hier geposteten (schnelle Abfrage gegen DUAL zur Validierung), aber es gibt auch eine interessante Lösung, die von JBoss speziell für Oracle bereitgestellt wird, indem die proprietäre PING-Methode in der Oracle JDBC Connection-Klasse verwendet wird. Siehe den Code aquí .

//Nikolaus

0 Stimmen

Beachten Sie, dass pingDatabase(int) im Typ IV-Treiber nichts anderes tut als "select 'x' from dual;".

1voto

Jörgen Punkte 11

Utilice pingDatabase(int timeout) Implementiert in OracleConnection seit 9.0.1

0 Stimmen

Beachten Sie, dass alles, was pingDatabase(int) im Typ IV-Treiber tut, ein "select 'x' from dual;" ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X