关于批处理db记录的建议

时间:2009-10-13 20:20:00

标签: java design-patterns java-ee ejb

我正在开发一个与现有遗留系统配合使用的webapp(visual jsf,ejb3,hibernate on glassfish / mysql)。

我有一个'employee'表(包含name(String),location(String)等字段),它与传统db2端的employee表分开。我使用employee表执行所有webapp处理。但是,每周我都需要安排一个任务来遍历表中的所有员工,并将它们与旧版db2表中的员工进行比较。如果旧表中的员工位置已更改,我需要更新我的员工表以反映新位置。

你认为最好的方法是什么?

目前,我正在读取所有员工的ArrayList,然后循环遍历列表中的每个员工实体,获取相应的旧员工实例,比较位置并在检测到位置更改时更新我的​​员工实体。

由于我的员工表中有近50000条记录,因此ArrayList的初始构建大约需要5分钟,这个员工编号只会继续增加。

5 个答案:

答案 0 :(得分:0)

为什么它应该在一周内只能同步一次?如果没有,您可能希望在一周内分散操作 - 每天完成1/7的工作。您还可以考虑在您身边添加一个表,以跟踪在何时同步哪条记录。

答案 1 :(得分:0)

我会创建一个dblink(dblinks确实存在于DB2上吗?)并执行类似的操作:

 select 
     a.id, a.location 
 from 
      empl a, empl@link b 
 where 
     a.id = b.id 
     and a.location <> b.location

然后迭代结果集,该结果集将包含所有位置已更改的结果集。

答案 2 :(得分: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

在交易中完成所有操作以避免竞争条件。

此解决方案的优点是只检查已更改的记录,因此在运行时它将非常高效。它确实需要对遗留模式进行更改,这可能是痛苦的或不可能的。

答案 3 :(得分:0)

我正在考虑使用jpa query的“setMaxResults()”和“setFirstResults()”方法来检索块中的员工数据。这些方法用于在UI中对显示数据进行分页,所以我没有看到为什么我不能这样做的任何原因。这样我就可以一次处理块。我可能会抛出一个队列和mdb来并行处理块,因为我无法在ejb容器中创建线程。

答案 4 :(得分:0)

我正在考虑使用JMS消息,队列和MDB来尝试解决此问题。我会将每个员工记录作为单独的消息发送到队列,然后,相应的MDB可以对该记录执行所有处理和更新。我想我可能会以这种方式实现更多的同步多处理。