【发布时间】:2017-11-07 02:11:01
【问题描述】:
有时关闭连接需要很长时间,比如超过 10 分钟到 1 小时,或者更糟,甚至无限期,具体取决于查询的繁重或缓慢。
在客户端因为花费太多时间而取消查询的情况下,我希望尽快释放使用的底层连接。
我尝试取消 PreparedStatement,关闭它,然后关闭结果集,最后关闭连接。取消几乎立即进行。关闭 PreparedStatement 和 ResultSet 花费了太多时间,我不得不将其包装在具有超时的 Callable 中,以便在适当的时候跳过该过程并继续关闭连接本身。我还没有什么可以尝试的运气。
我该如何处理?我不能简单地让连接不关闭,也不能让用户等待 10 分钟才能进行另一个类似的查询。
另外,是什么导致关闭连接花费太多时间?还有什么我可以做的吗?您认为 Oracle 查询提示会有所帮助吗?
顺便说一下,我正在通过瘦型驱动程序使用 Oracle JDBC。
更新:
显然,可以通过在 connectionCacheProperties 中配置 TimeToLive 属性来强制关闭连接,该属性会在特定时间内关闭连接。但是,我需要的是按需提供。这一点值得一提,因为这证明了可以像刚才的连接池那样强行关闭它。事实上,我什至在我的日志中收到了以下消息。
ORA-01013: user requested cancel..
【问题讨论】:
-
我从未听说过这样的场景,即连接需要时间才能关闭。
-
@OldProgrammer,尝试查询一些足够复杂的东西,以至于从结果集中获取前几条记录都需要花费太多时间。让我们不要进入这个问题的性能方面。我注意到,一旦查询得到几行,它就会很快关闭。我猜查询已经进入了一个不可关闭的阶段(但不是真的,到达 TimeToLive 可以关闭它),然后进入另一个阶段,它开始发送可关闭的记录。
-
您可以尝试使用 kill 语句从另一个 Oracle SPID 中止它(我们称之为您的应用管理员连接)。
-
@access_granted,您能否将其翻译为答案并使用 JDBC 使用编程 Java 解决方案?如果可行,我会接受。
标签: java oracle jdbc database-connection ojdbc