11

我正在处理的一个项目使用 Spring 2.5 & JPA 和 Hibernate 作为提供者。

我的 DAO 类扩展了 JpaDaoSupport,因此我使用 getJpaTemplate() 方法获取了我的 JpaTemplate。

后端数据库可以由我的应用程序或第三方应用程序更改。

当第三方应用程序更改数据库(主要是配置数据更改)时,我需要为我的应用程序用户提供一种方法来使所有 JPA 会话无效并重新加载新数据(即在后台使所有休眠会话无效)。这需要我的应用程序的所有并发用户“看到”。

我怎样才能做到这一点?

4

2 回答 2

25

有两个级别的缓存:

  • 第一级是 EntityManager 自己的缓存。

    您可以refresh在一个实体上,它将从数据库中重新加载,或者您可以clear在实体管理器本身上,在这种情况下,所有实体都将从缓存中删除。JPA 无法从缓存中仅驱逐一个特定实体。根据您使用的实现,您可以这样做,例如 Hibernate 的evict方法。

  • 二级缓存是全局缓存。

    JPA 1.0 不提供对二级缓存的支持。然后,您需要依赖底层的特定实现,或者禁用它。JPA 2.0 将通过@Cache注解和缓存 API 解决这个问题。您可以使用 Hibernate 特定的 API 清除二级缓存,例如SessionFactory.evict(...).

缓存的高级问题是:

  • 查询缓存

    某些查询的结果可以被缓存。在 JPA 1.0 中再次不支持它,但大多数实现都有方法来指定将缓存哪些查询以及如何缓存。

  • 聚类

    然后是集群中节点之间同步缓存的繁琐问题。在这种情况下,这主要取决于所使用的缓存技术,例如 JBoss 缓存。

你的问题仍然是通用的,答案将取决于你到底在做什么。

我在一个系统上工作,许多更新无需通过休眠即可完成,我们最终禁用了二级缓存。

但是您也可以跟踪所有打开的会话,并在必要时驱逐所有打开的会话的所有 1 级缓存,以及 2 级缓存。您仍然需要自己管理同步,但我想这是可能的。

于 2010-03-08T09:56:51.660 回答
2

从架构的角度来看,让其他应用程序绕过您的所有业务逻辑并修改持久数据并不是一个好主意。它使您的应用程序脚下的地面在很多方面都摇摇欲坠:)

以更优雅的方式与其他系统集成不是一个好主意,例如通过消息处理或批处理。Spring 对它们都有很大的支持。

于 2010-03-08T22:59:36.010 回答