2013-02-28 36 views
0

我有一个Java线程执行一些繁重的数据库操作。我正在编写一个API来杀死这个Java线程。 我为此使用executor框架,所以一旦我得到未来,我打电话future.cancel(),然后检查线程中断。Java:杀死执行数据库操作的线程

以上逻辑工作除非线程正在执行DB操作,这imples即杀死线程将首先涉及杀死DB连接,这意味着DBA干预scenarions细。

我的目标是创建不需要从支持团队的任何干预的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

哪里是代码? – TheWhiteRabbit 2013-02-28 08:03:41

+0

一些代码将是非常有益的 – 2013-02-28 08:04:10

+1

我添加的代码。问题更多的是逻辑,所以我没有粘贴它,人们刚刚敲响了降价! – Lokesh 2013-02-28 08:06:34

回答

1

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

从技术上讲,你可以尝试访问操作系统和搜索DB连接过程并杀死它,但正如我上面所说的,这不仅是不好的做法,但危险的。

所以,我的建议是找到某种方式做一小块一小块的大数据库操作,让你拥有更好的响应性和控制。

+0

我同意你的观点。我们有一个我们从不回滚的设计,而是弃用所有以前插入的记录。因此,一旦我们在杀死前一个数据库后重新启动java线程,数据库连接kill应该可以。 – Lokesh 2013-02-28 08:21:41

+0

那么,为什么你需要杀死数据库线程? – vainolo 2013-02-28 08:25:36

+0

该场景如下:我们处理了数百万条带到主内存的记录,所以我们有2个瓶颈。如果SQL运行出于某种原因或第二件事情可能是,如果我们想阻止当前calcultions缓慢,由于一些错误的数据首先什么[我们不希望等到整个计算完成。在这两种情况下,我们都需要终止线程功能,但在第一种情况下DB操作是一个问题。 – Lokesh 2013-02-28 08:30:14

0

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

+0

我不认为这是正确的做法。 – Lokesh 2013-02-28 08:33:06