将来取消也会在数据库端终止Oracle查询吗?

问题描述 投票:4回答:2

我正在使用Java Future类来执行连接Oracle数据库的程序。但是有时查询的速度比预期的要慢。我可以通过future.cancel方法取消未来。

假设我通过future.cancel取消了将来的线程。查询将在Oracle中停止执行,还是仅应用程序线程将被停止/取消,并且Oracle查询将继续在数据库端运行。

我们正在提交很多将来,有些提交的速度很慢。超时不会结束提交,但只能将它设置为future.get,但是按照Java规范,将来仍然会继续。

在这种情况下的实际行为是什么。

谢谢

java completable-future
2个回答
0
投票

您可以尝试将终止查询发送到DB,您将在其中使用要终止的查询的PID,尝试使用此链接以不同的方式终止查询How to kill a running SELECT statement。添加诸如isInterrupted()isAlive()之类的内容以检查线程的状态,然后发送查询以终止正在运行的查询。


0
投票

将来取消,如果已提交,则不会终止Oracle查询。更糟糕的是,Completablefuture的cancel只会导致CancellationException异常,从而使其异常完成。这甚至不会停止提交的任务,并且该任务将继续连接并查询数据库。

CompletableFuture.cancel():

如果尚未完成,请使用CancellationException完成此CompletableFuture。尚未完成的从属CompletableFutures也将异常完成,并具有由此CancellationException引起的CompletionException。]

mayInterruptIfRunning-此值在此实现中无效,因为不使用中断来控制处理。

如果想要使数据库连接超时,请在连接(Setting Network Timeout for JDBC connection)或Statement.cancel(When I call PreparedStatement.cancel() in a JDBC application, does it actually kill it in an Oracle database?)上尝试OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT。

此外,我建议对CompletableFutures使用小型FixedThreadPool执行程序来控制并行数据库线程的数量。

© www.soinside.com 2019 - 2024. All rights reserved.