如何在共享数据库中使用多个spring-data应用程序

时间:2019-03-25 10:25:14

标签: java-ee redis spring-data hazelcast distributed-caching

我有一个spring应用程序,它使用spring-data来访问数据库。现在,还有另一个应用程序,需要仅使用Hibernate / JPA访问数据来更新同一数据库。

如果我从APP2更新数据,则它们将不会通过spring-data在APP1中可见,因为基础EntityManager不会被刷新。

是否有任何现成的解决方案如何提供此功能?显然,我能想到的是:

  • 创建公共REST层以提供这些操作
  • 共享分布式缓存,例如Hazelcast,Redis

由于要重构APP1,我想避免第一种选择。我不确定秒数将如何工作,即:

  • APP1和APP2之间的共享对象将存储在分布式缓存中,并始终从那里读取。
  • 升级将通过相应的访问层执行-APP1将使用其弹簧数据存储库,APP2将使用其Hibernate / JPA服务(但是,EntityManager仍不会使用其他应用程序的可能更改进行更新)。

2 个答案:

答案 0 :(得分:0)

您可以将spring-data-hazelcastMapstore API一起使用。这对您的应用程序影响最小,但需要Mapstore实施。如果您选择在嵌入式模式下使用hazelcast,则可能会更好,因为您不必管理单独的中央缓存。 Hazelcast可根据您的应用程序需求进行扩展/扩展

答案 1 :(得分:0)

经过一番挖掘和测试之后,我实际上发现,Spring数据与Hibernate一起可以正确处理这种情况。

我已经基于纯Hibernate / JPA进行了测试,并且当使用两个EntityManager时,正确地我没有看到其中一个所做的更改(在构建过程中我将EntityManager创建为服务类成员) 。但是,spring-data的作用是,它会为每次@Transactional方法的调用打开一个新的Hibernate Session,并在完成后将其关闭。

问题在于特定的业务逻辑,因为它取决于@Transactional方法的上下文,如果可以的话,可以在方法调用期间“可能”使用过时的数据。