java - 当连接关闭时间过长时,如何强制关闭连接池中的连接?

标签 java oracle jdbc database-connection ojdbc

有时关闭连接会花费很多时间,例如超过 10 分钟到 1 小时,或更糟,甚至是无限期的时间,具体取决于查询的繁重或缓慢。

在客户端因为花费太多时间而取消查询的情况下,我希望尽快释放使用的底层连接。

我尝试取消PreparedStatement,关闭它,然后关闭结果集,最后关闭连接。取消几乎是瞬间完成的。关闭PreparedStatement和ResultSet花费了太多时间,我不得不将其包装在一个带有超时的Callable中,以便在适当的时候跳过该过程并继续关闭连接本身。我对其他可以尝试的东西没有太多运气。

我该如何处理这个问题?我不能简单地让连接处于未关闭状态,也不能让用户等待 10 分钟才能进行另一个类似的查询。

此外,是什么导致连接关闭花费了太多时间?我还有什么可以做的吗?您认为 Oracle 查询提示有帮助吗?

顺便说一句,我正在通过精简类型的驱动程序使用 Oracle JDBC。

更新:

显然,可以通过在 connectionCacheProperties 中配置 TimeToLive 属性来强制关闭连接,该属性会在特定时间内关闭连接。然而,我需要的是按需的。这是值得一提的,因为这证明了可以像刚才的连接池那样强制关闭它。事实上,我什至在我的日志中收到了以下消息。

ORA-01013: user requested cancel..

最佳答案

主要功能:

  String g_sid = "";

主题 1:

  String sql = ...;
  Connection conn = ...your connection func...;

  Statement stmt = conn.createStatement();
  ResultSet rset = stmt.executeQuery( "SELECT sid from v$mystat");
  if (rset.next()) g_sid = rset.getString("sid");
  rset.close();
  // now to the actual long-running SQL
  ResultSet rset = stmt.executeQuery( sql );
  // 
  stmt.close();

主题 2:

  String serialN = "";
  Connection conn = ...your admin connection func...

  Statement stmt = conn.createStatement();
  ResultSet rset = stmt.executeQuery( "SELECT serial# serialN from v$session where sid=" + g_sid );
  if (rset.next()) {
    serialN = rset.getString("serialN"); 
    stmt.execute("alter system kill session '" + g_sid + "," + serialN + "'");
  }
  stmt.close();
  // probably keep the admin connection open for further maintenance
  //

关于java - 当连接关闭时间过长时,如何强制关闭连接池中的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44383579/

相关文章:

sql - 从 View 创建表 - Oracle SQL SQL 错误 : ORA-01723: zero-length columns are not allowed

java - 无法通过 JDBC 禁用 Oracle 外键

jdbc - Spark作业服务器错误类未找到异常

java - Spring Boot安全: java. lang.StackOverflowError

java - 使用机器学习简化文本

sql - Oracle 错误 : ORA-00905: Missing keyword

Java - JDBC 驱动程序和 MySQL 数据库连接问题

java - 从结果集中获取数据太慢

java - 包内包 Java

java - 在 Webcontent 中找不到新文件。需要刷新