6

如何检查 jdbc for oracle 数据库中的打开连接?

注意:conn.isClosed()不能用于此。

4

4 回答 4

8

就像是:

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,您可以在“test-on-reserve”属性中指定 SELECT。

如果您正在开发自己的池,那么您可能想看看其他人是如何做到的(例如Proxool)。

于 2008-11-08T16:07:44.497 回答
2

通常连接池也会使用 Connection.isClosed() 方法来检查连接是否仍然有效。问题是并非所有 JDBC 驱动程序都能正确处理此调用。所以我假设有一些简单的检查语句,就像 RealHowTo 说的那样。对于 Oracle,他已经提到了“SELECT 1 FROM Dual”,这对于 Oracle 数据库应该总是成功的。我认为不同的数据库有类似的查询。我记得在之前的项目中,我们还实现了一个自己的连接池,它使用了这样的验证查询。

于 2008-11-19T11:41:29.437 回答
1

看到这个帖子。

引用的解决方案类似于此处发布的解决方案(对 DUAL 进行快速查询以进行验证),但 JBoss 还使用 Oracle JDBC Connection 类中的专有 PING 方法为 Oracle 提供了一个有趣的解决方案。请参阅此处的代码。

//尼古拉斯

于 2009-01-05T18:16:07.170 回答
1

使用pingDatabase(int timeout) 自 9.0.1 起在 OracleConnection 中实现

于 2009-11-19T15:24:58.640 回答