【问题标题】:Database synchronization techniques JPA / GUI数据库同步技术 JPA/GUI
【发布时间】:2014-05-26 00:34:55
【问题描述】:

大家好,我有使用 JPA (EclipseLink) 进行数据库访问的 Java 应用程序 - 一些 CRUD 操作。在这种情况下我如何进行同步?
我的意思是如果两个用户 User1 和 User2 在他们的机器上启动应用程序并且 User1 更改了一些记录如何让 User2 看到它? 是否有机会让 User2 知道 User1 更改记录并仅更新该记录?
这里讨论过同样的问题
How to synchronize multiple clients with a shared database (JPA)?
Updated data (in Database) is not visible via JPA/Eclipselink
但唯一的建议是按计时器更新。这是做这些事情的常见方法吗?
感谢您的帮助
[编辑]
Monitor MySQL inserts from different application
How to make a database listener with java?
change notification on domain objects (Hibernate/Java)
告诉我解决问题的方向。希望可以帮助别人。

【问题讨论】:

    标签: java database jpa synchronization eclipselink


    【解决方案1】:

    您应该为每个事务创建一个新的实体管理器实例。我建议使用带有 JTA 事务管理器的 spring,并让容器管理实体管理器范围。

    http://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/

    [编辑]

    注意,如果EntityManager上有refreh(someEntity)方法,就没有refreshAll()方法。这是因为 EM 的设计不是为了长时间使用和刷新。

    如果您让容器(对于独立应用程序建议使用 Spring)管理持久性上下文 (container managed entityManager),它将为每个事务实例化一个新的 EM。换句话说,每次调用带有@transactional 注释的方法时,都会为该方法的生命周期实例化一个新的EM。

    在这种情况下,您不需要关心数据同步,每次您希望刷新网格时,您都需要调用事务性 getMyEntityList() 方法,该方法将检索一组新的实体以显示在网格中。您当然可以使用计时器来触发刷新。

    诀窍是永远不要让未持久的修改在内存中。每次用户更新网格时,打开一个新事务并持久化修改,每次刷新时,检索一个新的最新持久性上下文并让 GC 处理旧的未引用实体。

    如果您不希望 user1 能够覆盖 user2 数据,请配置乐观锁定。

    否则,如果出于性能原因(避免定期为 DB 检索数据)绝对想维护应用程序范围的 EM,则可以为不同的应用程序实例设置消息传递主题,以便在数据更新时相互通知,但是这会导致额外的工作和限制。

    【讨论】:

    • 请参阅stackoverflow.com/questions/22772980/… 了解有关 EM 的一些一般性
    • 感谢您的回复和链接。据我了解,所有这些事情只有在用户进行 CRUD 操作时才会使 EM 同步,但是如果 User2 看到例如 Swing/JTable 中的一些记录,并且在那一刻在 User1 中更新该记录,该怎么办。如何让 User2 EM 知道记录已更新.计时器更新器是我唯一想到的,还有其他工具/模式/想法/其他东西我怎么能做到吗?
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多