2011-10-10 41 views
2

我需要在应用程序启动过程中将我的用户表与存储库(另一个数据库)同步。我有两个Apache mod_jk的Tomcat节点。所以当我重新启动它们时,我会进行双重插入和双重更新。这似乎是: T1开始 T2开始 T1读 T2读取数据 T1修改数据 T2修改相同的数据的数据 T1插入 T2刀片 T1提交 T2提交Java Hibernate + Oracle 11.2锁定

当T1修改数据,然后T2修改我丢失更新的相同数据。 当然,我在插入操作过程中有重复。 我应该如何做同步?

  1. 我想我可以使用“select * for update”(例如)锁定所有表并执行两个同步。一个满了,另一个空着。
  2. 我可以为此创建特殊表并将STATUS柱放在那里。当一个节点启动时,它执行STATUS字段的SELECT FOR UPDATE并将其更改为“RUNNING”。当另一个事务读取STATUS时,如果它设置为“RUNNING”,它将不执行同步。

什么是最好的解决方案?任何其他建议。 谢谢!

回答

1

的问题是,服务器启动并不意味着应用程序启动时,如果多台服务器用于托管应用程序。

如果你总是启动,并在同一时间同时停止服务器,仅仅只有其中的一个(通过在web.xml文件中的配置参数,或系统属性)配置以执行同步。

如果每台服务器可以启动和停止独立,那么我不会做在启动任何东西,而是实现它作为应用程序的管理使用情况,并触发其点播,从外面。

+0

谢谢!但我真的需要在启动时做,而不是按需。该业务不想推“同步”按钮))) – Nick

0

配置一台服务器,这样它不会做同步 - 就像JB Nizet说。在我们的项目中,我们使用Spring profiles

无论如何,如果你在一个业务键定义的唯一索引你不应该得到重复。您可以在Hibernate中使用optimistic locking摆脱Oracle的丢失更新。事务会尝试更新特定版本(它读取的版本),如果另一个事务使用新版本计数器更新它,则会发生错误。