我有一个在 JBoss AS 7 安装(Infinispan 二级缓存提供程序)上使用二级缓存的应用程序。
我们有一些更新的 JPQL 查询使缓存无效——我想知道如果我们在应用程序中包含一些本机 SQL 查询会产生什么影响。查询缓存会失效吗?
我还记得在 Hibernate 上使用 sqlQuery.addSynchronizedQuerySpace("") 指令来防止某些本机 SQL 查询的缓存失效。JPA也可以做到吗?
谢谢!
问问题
2397 次
1 回答
6
我今天在处理同样的问题时遇到了这个问题,所以我想我会在这里发布我的发现。
使用 JPA 原生 UPDATE/INSERT/DELETE 查询确实会导致 Hibernate 使整个2 级实体缓存无效。正如您在问题中提到的那样,Hibernate 有一个解决方法,但似乎不可能做与 Hibernate 等效的操作addSynchronizedQuerySpace()
,addSynchronizedEntityClass()
并addSynchronizedEntityName()
使用纯 JPA。
然而,JPA 允许您做的是访问unwrap
JPAQuery
对象以访问 JPA 提供者的 API。如果您使用 Hibernate 作为 JPA 提供程序,那么这将允许您使用 Hibernate 的addSynchronizedXxx
方法,如下所示:
Query query = entityManager.createNativeQuery("UPDATE user SET ...");
query.unwrap(org.hibernate.SQLQuery.class)
.addSynchronizedEntityClass(User.class);
这不是一个理想的解决方案,但它可以有效地防止整个二级缓存失效。
于 2014-09-12T03:03:49.203 回答