0

我有一个 java 线程,它执行一些繁重的数据库操作。我正在编写一个 api 来杀死这个 java 线程。我为此使用了执行器框架,所以一旦我得到未来,我就会调用 future.cancel() 然后检查线程中断。

上述逻辑工作正常,除了线程正在执行 DB 操作的场景,这意味着杀死线程将首先涉及杀死 DB 连接,这意味着 DBA 干预。

我的目标是创建一个不需要支持团队干预的 api。

关于如何解决这个问题的任何想法都将非常有帮助。

代码:

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);
        }
    }
4

2 回答 2

1

不要那样做!!!如果您的线程启动了数据库操作并且您将其杀死,则可能会导致数据库出现问题。假设你的线程正在更新数据库,而你杀死了它。它完成交易了吗?是否已提交更改?如果您杀死线程,您将不得不进行回滚,因为您说的是“繁重的数据库操作”,这可能非常昂贵!(我经历了数小时的数据库回滚......我开始讨厌它们)。

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

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

于 2013-02-28T08:18:13.773 回答
0

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

于 2013-02-28T08:29:25.790 回答