大家好,我有Java应用程序使用JPA(EclipseLink)进行数据库访问 - 一些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)
向我展示解决问题的方向。希望可以帮助别人。
答案 0 :(得分:1)
您应该为每个事务创建一个新的实体Manager实例。我建议将spring与JTA事务管理器一起使用,让容器管理实体管理器范围。
请参阅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数据,请配置乐观锁定。
否则,如果您出于性能原因(为了避免定期检索数据库的数据)而绝对希望维护应用程序作用域EM,则可以为不同的应用程序实例设置消息传递主题,以便在数据更新时通知对方,但这将导致额外的工作和限制。