我正在使用Java Future类来执行连接Oracle数据库的程序。但是有时查询的速度比预期的要慢。我可以通过future.cancel方法取消未来。
假设我通过future.cancel取消了将来的线程。查询将在Oracle中停止执行,还是仅应用程序线程将被停止/取消,并且Oracle查询将继续在数据库端运行。
我们正在提交很多将来,有些提交的速度很慢。超时不会结束提交,但只能将它设置为future.get,但是按照Java规范,将来仍然会继续。
在这种情况下的实际行为是什么。
谢谢
您可以尝试将终止查询发送到DB,您将在其中使用要终止的查询的PID,尝试使用此链接以不同的方式终止查询How to kill a running SELECT statement。添加诸如isInterrupted()
或isAlive()
之类的内容以检查线程的状态,然后发送查询以终止正在运行的查询。
将来取消,如果已提交,则不会终止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执行程序来控制并行数据库线程的数量。