2010-08-20 45 views
3

我對Spring很有經驗,但對Spring批處理很新。現在我的任務是將數據結構從一個數據庫中的簡單結構遷移到另一個數據庫中的更復雜的結構。該數據結構對應的對象層次結構是這樣Spring批處理:將n遷移到n可能是巨大的關係

OldParent 1 --> n OldChild // old system 

NewParent 1 --> n NewChild // new system 

在舊數據庫中,只有兩張桌子,在新系統中,事情就會變得更復雜,有8個表,我會命名,但這與現在無關。

基本上我想使用一個簡單的基於JDBC的解決方案,使用從OldParent讀取並轉換爲NewParent的rowmappers。

因此,這裏將是一個基本的配置片段:

<batch:job id="migration"> 
    <batch:step id="convertLegacyData"> 
     <batch:tasklet> 
      <batch:chunk 
       reader="parentReader" 
       writer="parentWriter" 
       commit-interval="200" /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

在這種情況下,parentReader將收購併轉換oldChild所的對象,可能委託給childReader/childWriter對象。

問題是這樣的:雖然有幾十萬個父母,但每個父母可能有零至幾百萬個孩子,所以基於父母的提交間隔根本無濟於事,但我非常希望擁有一個可配置的提交間隔。

因此,另一種解決方案是使工作流子爲基礎的:

<batch:job id="migration"> 
    <batch:step id="convertLegacyData"> 
     <batch:tasklet> 
      <batch:chunk 
       reader="childReader" 
       writer="childWriter" 
       commit-interval="200" /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

在這種情況下,childReader也將必須閱讀OldParent對象和寫NewParents,委託給parentReader和parentWriter對象。這裏的主要缺點是我失去了所有沒有關聯OldChild對象的OldParents。

第三種可能的情況是OldParent -> NewParentOldChild -> NewChild有兩個不同的工作流程。 (我將不得不維護一個存儲OldParent和NewParent ID之間關係的映射表,但我可以使用標準配置,包括commit-interval。

是否還有其他可能?您推薦哪些作爲最佳實踐?

回答

0

不它有一個的N-記錄提交間隔配置嗎?不,它使用類似BatchUpdates(JDBC),所以你可以配置N大小批量更新和提交每個BATCHUPDATE。

如果我沒有破解:)

製作你自己的java.sql.Connectio n實施。一個將所有命令傳遞給原始連接並在每次第N次更新後執行提交... :)

如果您使用的是DatabasePool,則也可以封裝原始文件,以返回包裝連接與黑客。

我知道這是一個有點奇怪的命題......但也許這是你一次性遷移所需要的一切。

+1

雖然你的第三段當然是一種做事情的方式,當沒有標準的配置選項存在時,我想繼續使用spring批處理標準並在我可以的地方使用commit-interval屬性,所以我正在尋找一種解決方案,可以被歸類爲春季批次最佳實踐,而不是黑客(即使我同意它可能用於一次性任務)。 – 2010-08-20 11:13:53