2009-10-13 53 views
0

我正在開發與現有遺留系統一起工作的webapp(visual jsf,ejb3,hibernate on glassfish/mysql)。關於批處理db記錄的建議

我有一個「僱員」表(用領域,如名稱(字符串),位置(字符串),等等),它是從上遺留DB2側僱員表分開。我用我的員工表完成所有的webapp處理。但是,每個星期我都需要安排一項任務來檢查表中的所有員工,並將其與舊版db2表中的員工進行比較。如果舊錶中的員工位置已更改,我需要更新我的員工表以反映新位置。

對於做這件事最好的方法是什麼?

目前我閱讀所有的員工進入一個ArrayList,然後通過列表中的每個員工實體循環,得到相應的遺產員工例如,比較位置,如果位置變化,檢測更新我的員工實體。

因爲我有近50000條記錄我的員工表,該ArrayList的初始構建大約需要5分鐘,這名僱員數量只會不斷增加。

+0

不幸的是我不能以任何方式修改db2,否則我可能會設置某種觸發器。 – SibzTer 2009-10-14 01:02:09

回答

0

是否有理由在一週內只同步一次?如果不是的話,你可能需要在一週內分散手術 - 每天做1/7次的手術。您也可以考慮在您身邊添加一張表以跟蹤哪些記錄在什麼時候同步。

+0

這是一個想法。不知道我會如何去做,直到現在。如果沒有別的辦法,我想我可以做到這一點。我正在使用location_history種類的表來跟蹤位置變化。謝謝。 – SibzTer 2009-10-14 01:06:30

+0

窮人的配料(sqlite方言)... 從僱員 選擇ID 其中id%7 = cast(strftime('%w','now')as integer); – Trenton 2009-10-14 02:38:54

0

我會創造一個DBLINK(dblinks做DB2權存在嗎?),並做一些事情,如:

select 
    a.id, a.location 
from 
     empl a, [email protected] b 
where 
    a.id = b.id 
    and a.location <> b.location 

然後遍歷這將對所有那些位置已經改變了結果集。

0

如果您有能力以任何方式更改舊錶,則可以添加一個needs_sync列。然後,使用觸發器或修改更新位置的代碼,在執行更新時設置needs_sync = 1。 (上欄添加一個索引,太。)

然後,找到記錄更新

select id, location 
from legacy.employee 
where needs_sync = 1 

當你成功地完成了同步

update employee 
set needs_sync = 0 
where needs_sync = 1 

完成所有的交易以避免競爭狀況。

該解決方案的優點是隻檢查已更改的記錄,因此它在運行時效率很高。它確實需要對遺留模式進行更改,這可能很痛苦或無法完成。使用JPA查詢的「setMaxResults()」和「setFirstResults()」方法來檢索塊員工數據的

+0

不幸的是,我無法以任何方式修改遺留模式。但感謝回覆,雖然 – SibzTer 2009-10-14 01:03:06

0

即時通訊思想。這些方法用於在UI中對顯示數據進行分頁,所以我沒有看到爲什麼我無法做到這一點。這樣我就可以一次處理塊。我可能會拋出隊列和mdb來並行處理塊,因爲我不能在ejb容器內創建線程。

+0

不知道這是否會起作用。有人向我指出,db2可能不會正確支持setMaxResults()和setFirstResults()方法。需要檢查出來。 – SibzTer 2009-10-14 16:25:41

+0

如果我只是手動構建塊,那麼如何? – SibzTer 2009-11-17 16:55:15

0

我想使用JMS消息,隊列和MDB來嘗試並解決這個問題。我會將每條員工記錄作爲單獨的消息發送到隊列,然後,相應的MDB可以爲該記錄執行所有處理和更新。我想我可能會以這種方式進行更多的同時多處理。