Программно проверять открытое соединение в JDBC
Как проверить наличие открытого соединения в jdbc для базы данных Oracle?
Замечания: conn.isClosed()
не может быть использовано для этого.
4 ответа
Обычно пул соединений также использует метод Connection.isClosed() для проверки того, что соединение все еще действует. Проблема в том, что не все драйверы JDBC будут правильно обрабатывать этот вызов. Поэтому я предполагаю, что есть несколько простых проверочных операторов, как сказал RealHowTo. Для Oracle он уже упомянул "SELECT 1 FROM Dual", который всегда должен выполняться для баз данных Oracle. Я думаю, что есть похожие запросы для другой базы данных. Я помню, что в предыдущем проекте мы также реализовали собственный пул подключений, который использовал такие запросы проверки.
Что-то вроде:
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();
}
Обратите внимание, что если соединение исходит из пула соединений (например, на сервере приложений), тогда в пуле может быть механизм проверки правильности соединения. В BEA вы указываете SELECT в свойстве "тест на резерв".
Если вы разрабатываете свой собственный пул, вы можете посмотреть, как это делают другие (например, Proxool).
Смотрите это сообщение.
Указанные решения похожи на опубликованные здесь (быстрый запрос к DUAL для проверки), но есть также интересное решение, предоставленное JBoss для Oracle с использованием проприетарного метода PING в классе Oracle JDBC Connection. Смотрите код здесь.
// Николай
Использовать pingDatabase(int timeout) Реализовано в OracleConnection начиная с 9.0.1