Mamy żądania obsługi serwera WWW od klientów. Jeden składnik tego serwera sieci Web zawiera połączenie z bazą danych.Czy istnieje bezpieczny sposób na stwierdzenie, czy połączenie JDBC jest nadal w porządku?
Muszę być w stanie rozpoznać, czy połączenie zostało zamknięte lub w jakiś sposób nie funkcjonuje, zanim zacznę go używać. Obecnie robię coś takiego:
// 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;
}
Niestety czasami zwraca takie nieaktualne połączenie, że dostaję jeden z różnych błędów. Jednym z takich wygląda następująco:
java.sql.SQLException: Io wyjątek: Oprogramowanie spowodowało przerwanie połączenia: błąd zapisu gniazda
Należy pamiętać, że jest to tylko jeden z błędów rejestrowanych i ten dzieje się po około 72 godziny bezczynności.
To, czego szukam, to minimalny tester połączenia z bazą danych, który powinien konsekwentnie określać, czy połączenie działa, działa i jest stabilne. czy to możliwe?
Nie mam nic przeciwko uruchomieniu bardzo niewielkiej kwerendy przeciwko niemu, ale musi to być zarówno agnostyka bazy danych, jak i nie zabierać zbyt mało czasu/zasobów.
BTW: Używam Java 5, więc Connection.isValid
nie jest rozwiązaniem dla mnie.
Dodany
Dla tych z Was, odwiedzając tę kwestię później - w końcu wziął zaproponowane rozwiązania i przeniosła się do prawdziwego puli połączeń i nie tylko było to zadziwiająco łatwe do zrobienia, ale wszystko z moje problemy zniknęły.
Jedyną dziwną częścią było uświadomienie sobie, że z pulą połączeń po zakończeniu połączenia musisz uzyskać close
- basen przechwytuje zamknięcie i zwraca go do puli za kulisami.
Co masz przeciwko gotowym pulom połączeń, które sprawdzają połączenia w trybie rutynowym? –
@MarkoTopolnik - nic - jako takie - ale przygotowałem oświadczenia dołączone do tych połączeń, więc muszę sam je obsłużyć. A może ja? – OldCurmudgeon
W rzeczywistości jest to problem, który te pule również obsługują, z przygotowanymi pulami instrukcji. BTW moim wyborem byłby * boneCP *. –