使JPA EntityManager会话无效

时间:2010-03-08 09:53:32

标签: hibernate spring session jpa invalidation

我正在开发的项目使用Spring 2.5& JPA以Hibernate作为提供者。

我的DAO类扩展了JpaDaoSupport,所以我使用getJpaTemplate()方法得到了我的JpaTemplate。

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:22)

有两种级别的缓存:

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

    您可以在一个实体上refresh,它将从数据库重新加载,或者您可以clear实体管理器本身,在这种情况下,所有实体都将从缓存中删除。 JPA从缓存中无法evict only one specific entity。根据您使用的实现,您可以执行此操作,例如Hibernate的evict方法。

  • 二级缓存是全局缓存。

    JPA 1.0没有提供对二级缓存的支持。然后,您需要依赖底层的特定实现,或者禁用它。带有@Cache注释的JPA 2.0 will address this issue和缓存API。您可以使用特定于Hibernate的API清除二级缓存,例如SessionFactory.evict(...)

缓存的高级问题是:

  • 查询缓存

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

  • 聚类

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

你的问题仍然是某种通用的,答案取决于你究竟在做什么。

我在一个系统上工作了很多更新都是在不经过hibernate的情况下完成的,我们最终禁用了二级缓存。

但您也可以跟踪所有已打开的会话,并在必要时逐出所有已打开会话的所有第一级缓存,再加上第二级缓存。您仍然需要自己管理同步,但我认为这是可能的。

答案 1 :(得分:1)

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

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