Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式检查JDBC中的打开连接_Java_Oracle_Jdbc - Fatal编程技术网

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

Java 以编程方式检查JDBC中的打开连接,java,oracle,jdbc,Java,Oracle,Jdbc,如何在jdbc for oracle数据库中检查开放连接 注意:conn.isClosed()不能用于此操作。类似于: Statement stmt = null; ResultSet rs =null; try { stmt = conn.createStatement(); // oracle rs = stmt.executeQuery("SELECT 1 FROM Dual"); // others // rs = stmt.executeQuery("SE

如何在jdbc for oracle数据库中检查开放连接

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

类似于:

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


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

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

请参阅发布

参考的解决方案类似于此处发布的解决方案(快速查询双验证),但JBoss也提供了一个有趣的解决方案,该解决方案是针对Oracle的,它使用Oracle JDBC连接类中的专有PING方法。请参阅代码

//尼古拉斯使用
从9.0.1开始在OracleConnection中实现,你想知道你的应用程序是否有打开的连接,或者你想知道DB是否有打开的任何连接。我想实现连接池。从JRE 6开始,就有一个方法被引入,并且它确实在许多JDBC驱动程序中实现。这取决于你的环境,您的连接池应该正在检查连接。否则,如果与数据库失去连接,通常必须重新启动应用程序服务器才能重新启动池。我强烈怀疑,如果连接关闭,executeQuery将抛出SQLException。注意,Type IV驱动程序中的所有pingDatabase(int)都是“从dual中选择“x”;注意所有pingDatabase(int)IV型驱动程序中是否有“从双选择x”