2008-11-08 16 views
6

Jak sprawdzić otwarte połączenie w jdbc dla bazy danych Oracle?programowo sprawdzające otwarte połączenie w JDBC

Uwaga: conn.isClosed() nie może być do tego użyty.

+0

Chcesz wiedzieć, czy Twoja aplikacja ma otwarte połączenie lub chcesz wiedzieć, czy DB ma połączenie otwartego na byle co. – sblundy

+0

Chcę zaimplementować pulę połączeń. –

+0

to sprawdzić [Stan połączenia Java JDBC] (http://stackoverflow.com/a/30888132/782535) –

Odpowiedz

2

Zwykle pula połączeń wykorzystuje również metodę Connection.isClosed(), aby sprawdzić, czy połączenie jest nadal prawidłowe. Problem polega na tym, że nie wszystkie sterowniki JDBC będą poprawnie obsługiwać to wywołanie. Zakładam więc, że istnieje kilka prostych sprawdzeń, takich jak RealHowTo. W przypadku Oracle wspomniał już o "SELECT 1 FROM Dual", który powinien odnieść sukces zawsze w przypadku baz danych Oracle. Myślę, że istnieją podobne zapytania dla różnych baz danych. Pamiętam, że w poprzednim projekcie wdrożyliśmy również własną pulę połączeń, która wykorzystywała takie zapytania walidacyjne.

8

Coś jak:

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(); 
} 

Zauważ, że jeśli połączenie jest pochodzący z Bilard (w serwerze aplikacji, na przykład), to basen może mieć mechanizm, aby sprawdzić, czy połączenie jest poprawne, czy nie. W przypadku BEA należy określić SELECT w właściwości "test-na-rezerwę".

Jeśli tworzysz własną pulę, możesz rzucić okiem na to, jak robią to inni (na przykład Proxool).

+0

W zależności od środowiska Twoja Pula połączeń POWINNA sprawdzać połączenie. W przeciwnym razie, jeśli utracisz łączność z bazą danych, zwykle musisz ponownie uruchomić serwer aplikacji, aby zrestartować pulę. –

+0

Podejrzewam, że executeQuery rzuci wyjątek SQLException, jeśli połączenie zostanie zamknięte. –

1

Zobacz księgowanie this.

Rozwiązania, do których odwołuje się podobne rozwiązanie, są podobne do tych zamieszczonych tutaj (szybkie zapytanie do DUAL w celu sprawdzenia poprawności), ale istnieje również interesujące rozwiązanie dostarczone przez firmę JBoss dla Oracle przy użyciu zastrzeżonej metody PING w klasie Oracle JDBC Connection. Zobacz kod here.

// Nicholas

+0

Zauważ, że wszystkie polecenia pingDatabase (int) w sterowniku typu IV to "wybierz" x "z podwójnego;" – leonigmig

1

Zastosowanie pingDatabase(int timeout) Zaimplementowane w OracleConnection od 9.0.1

+0

Zauważ, że wszystkie polecenia pingDatabase (int) w sterowniku typu IV to "wybierz" x "z podwójnego;" – leonigmig

Powiązane problemy