Программно проверять открытое соединение в 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

Другие вопросы по тегам