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

Posted

技术标签:

【中文标题】以编程方式检查 JDBC 中的打开连接【英文标题】:programmatically checking for open connection in JDBC 【发布时间】:2008-11-08 15:24:36 【问题描述】:

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

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

【问题讨论】:

您想知道您的应用是否打开了连接,或者您想知道数据库是否打开了任何连接。 我要实现连接池。 看看Java JDBC connection status 自 JRE 6 以来,为此特定目的引入了一个方法 conn.isValid(timeout),并且它确实在许多 JDBC 驱动程序中实现。 【参考方案1】:

类似:

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)。

【讨论】:

根据您的环境,您的连接池应该检查连接。否则,如果您失去与数据库的连接,您通常必须重新启动应用程序服务器才能重新启动池。 我强烈怀疑如果连接关闭,executeQuery 会抛出 SQLException。【参考方案2】:

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

【讨论】:

【参考方案3】:

见this发帖。

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

//尼古拉斯

【讨论】:

请注意,所有 pingDatabase(int) 在 Type IV 驱动程序中所做的都是“从 Dual 中选择 'x';”【参考方案4】:

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

【讨论】:

请注意,所有 pingDatabase(int) 在 Type IV 驱动程序中所做的都是“从 Dual 中选择 'x';”

以上是关于以编程方式检查 JDBC 中的打开连接的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式连接到 ***?

Android - 以编程方式检查互联网连接并在未连接时显示对话框

JDBC编程的方式

无法打开 JDBC 连接以执行 DDL

以编程方式为 Postgres JDBC 生成一个“DataSource”对象

Spring Boot 连接 Oracle 数据库时出错:无法打开 JDBC 连接以执行 DDL