我有一个java线程,它执行一些繁重的数据库操作。我正在编写一个api来杀死这个java线程。 我正在使用执行程序框架,所以一旦我得到了未来,我调用future.cancel()然后检查线程中断。
上面的逻辑工作正常,除了线程执行数据库操作的情况,实现杀死线程首先涉及杀死数据库连接,这意味着DBA干预。
我的目标是创建一个不需要支持团队干预的api。
任何关于如何解决这个问题的想法都会非常有用。
CODE:
private void killBatches1() {
if (killBatchRunning.compareAndSet(false, true)) {
try{
Iterator<Future<?>> futureIterator = futuresForBatch.iterator();
while (futureIterator.hasNext()) {
Future<?> future = futureIterator.next();
if (future.cancel(true))
;
futureIterator.remove();
}
}finally{
killBatchRunning.set(false);
}
}
答案 0 :(得分:1)
从技术上讲,您可以尝试访问操作系统并搜索数据库连接过程并将其终止,但正如我上面所说,这不仅是不好的做法,而且很危险。
所以,我的建议是找到一些方法在小块中进行大数据库操作,这样你就能有更好的响应和控制。
答案 1 :(得分:0)
理论上你可以调用线程中断()。如果JDBC驱动程序支持中断,则会调用适当的异常,这应该在您的代码中捕获。如果没有,您可以尝试关闭连接。那也应该抛出异常。无论如何,在JDBC驱动程序规范中研究这个问题。