2009-10-13 58 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可以为该记录执行所有处理和更新。我想我可能会以这种方式进行更多的同时多处理。