以编程方式检查JDBC中的开放连接

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

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

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

就像是:

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

请注意,如果连接来自连接池(例如,在Application Server中),则池可能具有检查连接是否有效的机制。 使用BEA,您可以在“test-on-reserve”属性中指定SELECT。

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

看到这个post。

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

//尼古拉斯

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