【问题标题】:suggestion on batch processing db records关于批处理数据库记录的建议
【发布时间】:2010-04-08 01:35:43
【问题描述】:

我正在开发一个适用于现有遗留系统的 web 应用程序(visual jsf、ejb3、hibernate on glassfish/mysql)。

我有一个“员工”表(包含名称(字符串)、位置(字符串)等字段),它与遗留 db2 端的员工表是分开的。我使用员工表进行所有 webapp 处理。但是,每周我都需要安排一个任务来检查表中的所有员工,并将它们与遗留 db2 表中的员工进行比较。如果旧表中的员工位置已更改,我需要更新我的员工表以反映新位置。

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

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

由于我的员工表中有近 50000 条记录,因此 ArrayList 的初始构建大约需要 5 分钟,而且这个员工人数只会不断增加。

【问题讨论】:

  • 不幸的是,我无法以任何方式修改 db2,否则我可以设置某种触发器。

标签: java design-patterns jakarta-ee ejb


【解决方案1】:

是否有理由每周只同步一次?如果没有,您可能希望将操作分散到一周内——每天完成 1/7 的工作。您还可以考虑在您的身边添加一个表格来跟踪同步的记录。

【讨论】:

  • 这是一个想法。不知道我现在会怎么做。如果没有其他办法,我想我可以做到。我正在使用 location_history 类型的表来跟踪位置变化。谢谢。
  • 穷人的批处理(sqlite方言)... select id from employee where id % 7 = cast(strftime('%w', 'now') as integer);
【解决方案2】:

我会创建一个 dblink(dblinks 确实存在于 DB2 上,对吗?)并执行以下操作:

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

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

【讨论】:

    【解决方案3】:

    如果您能够以任何方式更改旧表,则可以向其添加 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
    

    在事务中执行所有操作以避免竞争条件。

    此解决方案的优点是只检查已更改的记录,因此在运行时会很有效。它确实需要对旧架构进行更改,这可能会很痛苦或不可能做到。

    【讨论】:

    • 不幸的是,我无法以任何方式修改旧架构。不过谢谢你的回复
    【解决方案4】:

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

    【讨论】:

    • 不确定这是否可行。有人向我指出,db2 可能不正确支持 setMaxResults() 和 setFirstResults() 方法。需要检查一下。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多