2011-09-22 457 views
1

我正在更新數據庫中的多個記錄。現在,無論何時UI發送要更新的記錄列表,我都必須更新數據庫中的這些記錄。我正在使用JDBC模板。在java中以多線程方式插入或更新數據庫中的多個記錄

此前案例

早些時候我是什麼時候我得到了記錄從UI,我只是做

jdbcTemplate.batchUpdate(Query, List<object[]> params) 

每當有一個例外,我用於回滾整個事務。

更新:是BATCHUPDATE多線程或者在某個方面要比批量更新更快?)

後一種情況下

但每當有例外,後來由於需求變化。所以,每當有一些例外,我應該知道哪些記錄無法更新。所以我不得不將這些記錄發回給用戶界面,以避免出現異常,並說明他們爲什麼失敗。

,所以我不得不做一些類似的:

for(Record record : RecordList) 
{ 
    try{ 
     jdbcTemplate.update(sql, Object[] param) 
    }catch(Exception ex){ 
     record.setReason("Exception : "+ex.getMessage()); 
     continue; 
    } 
} 

所以,我在正確的方式做這個,通過使用循環?

如果是的話,有人可以建議我如何使它成爲多線程。 或者在這種情況下有什麼問題。 是真實的,我是猶豫使用try catch塊的循環:(內。

請指正,確實需要學習一個更好的辦法,因爲我自己覺得,必須有一個更好的方法,謝謝。

+1

而不是做在同一行觸摸單獨的線程批量更新,你爲什麼不嘗試拆分在你的線程中以非衝突的方式完成工作? – stevevls

回答

1

使所有的更新操作集合贖回<>, 其發送到java.util.concurrent.ThreadPoolExecutor中。該池是多線程的。

化妝贖回:

class UpdateTask implements Callable<Exception> { 
    //constructor with jdbctemplate,sql,param goes here. 
    @Override 
    public Exception call() throws Exception { 
     try{ 
       jdbcTemplate.update(sql, Object[] param) 
      }catch(Exception ex){ 
        return ex; 
      } 

     return null; 
    } 

invoke調用:

<T> List<Future<T>> java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException 
1

你的情況看起來像你需要在Java中使用驗證,並單獨篩選出有效數據發送到數據庫更新。

BO layer
-> filter out the Valid Record.
-> Invalid Record should be send back with some validation text.

In DAO layer
-> batch update your RecordList

這會給你最好的性能。

從不使用數據庫插入異常作爲驗證機制。

  1. 例外的是昂貴的堆棧跟蹤,必須創建
  2. 連接到數據庫是另一種昂貴的過程,需要一定的時間來獲取連接
  3. 的Java的if-else將爲同一數據 - 運行得更快基地驗證
+0

是的,我同意你所有的觀點,但我的朋友我沒有驗證邏輯。例外情況是我們無法考慮代碼可能失敗的情況。謝謝,但不適用於我的情況。 – kinshuk4

+0

@ kinshuk4 1st我會嘗試在驗證中捕獲最大的已知問題。然後,我會期待我們不能預測的未知原因的例外。仍然爲你的情況,你可以做一件事情你可以有兩個實現'<批量插入邏輯>異常<調用個人插入邏輯>''。不知道代碼評審團隊是否會對邏輯感到滿意 –