2011-03-08 39 views
1

我正在處理一個對我來說很陌生的代碼庫,它使用了iBatis。 我需要更新或添加到現有的表,它可能涉及20,000多條記錄。 該過程每天運行一次,並在半夜運行。一般交易處理很多記錄的問題

我從Web服務調用中獲取數據。我打算獲取數據,然後爲每個記錄填充一個模型類型對象,並將每個模型類型對象傳遞給將讀取對象中數據的一些方法,並將數據更新/插入到表中。

例子:

ArrayList records= new ArrayList(); 
Foo foo= new Foo(); 
foo.setFirstName("Homer"); 
foo.setLastName("Simpson"); 
records.add(foo); 
//make more Foo objects, and put in ArrayList. 

updateOrInsert(records); //this method then iterates over the list and calls some method that does the updating/inserting 

我的主要問題是如何處理所有的更新/插入作爲交易。如果系統在讀取所有記錄以更新/插入表之前關閉,我需要知道,因此我可以返回到Web服務調用並在系統正常時重試。

我使用的是Java 1.4,而db是Oracle。

回答

0

我會強烈建議您考慮使用Spring Batch的 - http://static.springsource.org/spring-batch/

框架提供大量的批量處理所需的基本特徵 - 錯誤報告,交易管理,多線程,縮放,輸入驗證。

這個框架設計得非常好,而且非常容易使用。

由於您正在等待讀取所有對象,將它們全部存儲在內存中,然後插入到數據庫中,您列出的方法可能無法很好地執行。

你可能要考慮設計過程如下:

  1. 創建能夠存儲200個對象
  2. 調用Web服務來獲取數據
  3. 創建一個對象實例的高速緩存,驗證並將數據存儲在對象的字段中
  4. 將對象添加到緩存中。
  5. 當緩存已滿,執行批提交在緩存中的對象的數據庫
  6. 繼續執行步驟1

SpringBatch將允許你進行批量提交,控制批量大小提交時,在讀取輸入時執行錯誤處理 - 在您的情況下重試請求,在將數據寫入數據庫時​​執行錯誤處理。

看看它。

+0

我不允許使用除我擁有的東西以外的任何東西,它基本上只是Java 1.4。您概述的步驟很有幫助,您是否介意評論我將如何使用交易? – bmw0128 2011-03-09 17:26:07

+0

如果你不允許使用1.4以外的其他東西,那麼你將不得不自己做tx管理。 – sdc 2011-03-09 19:31:48

+0

抓取連接,將autocommit設置爲false,執行批量插入,當完成所有記錄時,執行顯式提交 – sdc 2011-03-09 19:32:33