Java:杀死执行数据库操作的线程

时间:2013-02-28 08:01:07

标签: java database multithreading

我有一个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);
        }
    }

2 个答案:

答案 0 :(得分:1)

不要这样做!如果您的线程启动了数据库操作并且您将其终止,则可能会导致数据库出现问题。假设你的线程正在更新数据库,你就杀了它。它完成了交易吗?承诺的变化是什么?如果你杀了线程,那么你将不得不做回滚,因为你说&#34;繁重的数据库操作&#34;,可能非常昂贵! (我经历过数小时的数据库回滚......我开始讨厌它们。)

从技术上讲,您可以尝试访问操作系统并搜索数据库连接过程并将其终止,但正如我上面所说,这不仅是不好的做法,而且很危险。

所以,我的建议是找到一些方法在小块中进行大数据库操作,这样你就能有更好的响应和控制。

答案 1 :(得分:0)

理论上你可以调用线程中断()。如果JDBC驱动程序支持中断,则会调用适当的异常,这应该在您的代码中捕获。如果没有,您可以尝试关闭连接。那也应该抛出异常。无论如何,在JDBC驱动程序规范中研究这个问题。