有时关闭连接会花费很多时间,例如超过 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/