【问题标题】:Java Hibernate + Oracle 11.2 LockingJava Hibernate + Oracle 11.2 锁定
【发布时间】:2011-10-10 14:52:39
【问题描述】:

我需要在应用程序启动期间将我的用户表与存储库(另一个数据库)同步。我有两个带有 Apache mod_jk 的 Tomcat 节点。因此,当我重新启动它们时,我会进行双重插入和双重更新。这好像是: T1开始 T2开始 T1 读取数据 T2读取数据 T1修改数据 T2修改相同数据 T1 插入 T2 刀片 T1 提交 T2 提交

当 T1 修改数据然后 T2 修改相同的数据时,我丢失了更新。 当然,我在插入操作期间有重复。 我应该如何进行同步?

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

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

【问题讨论】:

    标签: oracle hibernate tomcat synchronization locking


    【解决方案1】:

    问题在于,如果不止一台服务器用于托管应用程序,那么服务器启动并不意味着应用程序启动。

    如果您总是同时启动和停止两台服务器,只需配置其中一台(通过 web.xml 文件中的配置参数或系统属性)即可执行同步。

    如果每个服务器都可以独立启动和停止,那么我不会在启动时做任何事情,而是将其实现为应用程序的管理用例,并从外部按需触发它。

    【讨论】:

    • 谢谢!但我真的需要在启动时做,而不是按需做。企业不想按下“同步”按钮)))
    【解决方案2】:

    配置一台服务器,使其不进行同步 - 正如 JB Nizet 所说。在我们的项目中,我们使用Spring profiles

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

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 2011-08-24
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多