首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二级Hibernate查询缓存驱逐

二级Hibernate查询缓存驱逐
EN

Stack Overflow用户
提问于 2015-08-01 08:42:30
回答 1查看 2.6K关注 0票数 3

我的问题是:如何排除二级缓存查询?

到目前为止使用的技术:Spring3.2框架,JPA2.0和hibernate 3.2。

我在我的persistence.xml中定义了以下属性:

代码语言:javascript
复制
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>

到目前为止,我们在代码中的任何地方都不存在直接依赖Hibernate的情况。

代码语言:javascript
复制
 query.setHint("org.hibernate.cacheable", true);

回到问题上:

我已经为一个复杂的查询( 6-7表联接和一些条件)实现了二级查询缓存。

好的是,所有这些表中的数据都不太可能发生变化,而且由于每个用户都会触发相同的数据,所以这是需要缓存的完美查询。

但是,如果更新了任何一个基础表中的数据,则需要取消缓存。JPA EntityManagerProvider提供了两种方法

代码语言:javascript
复制
emf.getCache().evictAll();
emf.getCache().evict();

我不能使用evictAll(),因为我相信它会清除应用程序的所有缓存。evict()似乎只用于将缓存从特定实体中删除,而不是查询。所以请给我一个最佳的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2016-10-20 17:06:25

当我使用包装数据库视图的实体时,我需要这样做。我以前从不缓存视图结果,直到我弄明白了这一点。

我现在要做的是:

在执行查询时,我为两个缓存设置了一个提示,并使用了一个命名的缓存区域。这个名字是任意的,可以是任何你想要的。

代码语言:javascript
复制
List allItems = em.createQuery("from EventStatus", EventStatus.class)
            .setHint("org.hibernate.cacheable", true)
            .setHint("org.hibernate.cacheRegion", "event-status")
            .getResultList();

修改任何影响查询的实体后:

代码语言:javascript
复制
entityManagerFactory.unwrap(SessionFactory.class).getCache().evictQueryRegion("event-status");

我在配置中注册了一个全局侦听器,并在任何相关实体类更改后调用evictQueryRegion。

在任何大容量删除(不触发侦听器事件)之后,我将手动删除查询缓存区域。

当然,这是Hibernate特有的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31759985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档