【问题标题】:2nd level cache invalidation with native queries本机查询的二级缓存失效
【发布时间】:2013-10-03 23:34:00
【问题描述】:

我有一个在 JBoss AS 7 安装(Infinispan 二级缓存提供程序)上使用二级缓存的应用程序。
我们有一些更新的 JPQL 查询使缓存无效——我想知道如果我们在应用程序中包含一些本机 SQL 查询会产生什么影响。查询缓存会失效吗?
我还记得在 Hibernate 上使用 sqlQuery.addSynchronizedQuerySpace("") 指令来防止某些本机 SQL 查询的缓存失效。 JPA也可以做到吗?
谢谢!

【问题讨论】:

    标签: jpa jpa-2.0 jboss7.x


    【解决方案1】:

    我今天在处理同样的问题时遇到了这个问题,所以我想我会在这里发布我的发现。

    使用 JPA 原生 UPDATE/INSERT/DELETE 查询确实会导致 Hibernate 使 整个 2 级实体缓存无效。正如您在问题中提到的那样,Hibernate 有一个解决方法,但似乎不可能使用纯 JPA 来完成与 Hibernate 的addSynchronizedQuerySpace()addSynchronizedEntityClass()addSynchronizedEntityName() 等效的操作。

    然而,JPA 允许您做的是 unwrap 一个 JPA Query 对象以获取对 JPA 提供者 API 的访问权限。如果您使用 Hibernate 作为 JPA 提供程序,那么这将允许您使用 Hibernate 的 addSynchronizedXxx 方法,如下所示:

    Query query = entityManager.createNativeQuery("UPDATE user SET ...");
    query.unwrap(org.hibernate.SQLQuery.class)
            .addSynchronizedEntityClass(User.class);
    

    这不是一个理想的解决方案,但它可以有效地防止整个二级缓存失效。

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 2011-12-18
      • 2023-04-03
      • 2014-06-20
      • 2014-06-28
      • 2014-10-22
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多