我的问题是:如何排除二级缓存查询?
到目前为止使用的技术:Spring3.2框架,JPA2.0和hibernate 3.2。
我在我的persistence.xml中定义了以下属性:
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>到目前为止,我们在代码中的任何地方都不存在直接依赖Hibernate的情况。
query.setHint("org.hibernate.cacheable", true);回到问题上:
我已经为一个复杂的查询( 6-7表联接和一些条件)实现了二级查询缓存。
好的是,所有这些表中的数据都不太可能发生变化,而且由于每个用户都会触发相同的数据,所以这是需要缓存的完美查询。
但是,如果更新了任何一个基础表中的数据,则需要取消缓存。JPA EntityManagerProvider提供了两种方法
emf.getCache().evictAll();
emf.getCache().evict();我不能使用evictAll(),因为我相信它会清除应用程序的所有缓存。evict()似乎只用于将缓存从特定实体中删除,而不是查询。所以请给我一个最佳的解决方案。
发布于 2016-10-20 17:06:25
当我使用包装数据库视图的实体时,我需要这样做。我以前从不缓存视图结果,直到我弄明白了这一点。
我现在要做的是:
在执行查询时,我为两个缓存设置了一个提示,并使用了一个命名的缓存区域。这个名字是任意的,可以是任何你想要的。
List allItems = em.createQuery("from EventStatus", EventStatus.class)
.setHint("org.hibernate.cacheable", true)
.setHint("org.hibernate.cacheRegion", "event-status")
.getResultList();修改任何影响查询的实体后:
entityManagerFactory.unwrap(SessionFactory.class).getCache().evictQueryRegion("event-status");我在配置中注册了一个全局侦听器,并在任何相关实体类更改后调用evictQueryRegion。
在任何大容量删除(不触发侦听器事件)之后,我将手动删除查询缓存区域。
当然,这是Hibernate特有的。
https://stackoverflow.com/questions/31759985
复制相似问题