2013-02-28 111 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