ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 19.4\. 查询缓存(The Query Cache) 查询的结果集也可以被缓存。只有当经常使用同样的参数进行查询时,这才会有些用处。 要使用查询缓存,首先你必须打开它: ``` hibernate.cache.use_query_cache true ``` 该设置将会创建两个缓存区域 - 一个用于保存查询结果集(`org.hibernate.cache.StandardQueryCache`); 另一个则用于保存最近查询的一系列表的时间戳(`org.hibernate.cache.UpdateTimestampsCache`)。 请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。 所以查询缓存通常会和二级缓存一起使用。 绝大多数的查询并不能从查询缓存中受益,所以Hibernate默认是不进行查询缓存的。如若需要进行缓存,请调用 `Query.setCacheable(true)`方法。这个调用会让查询在执行过程中时先从缓存中查找结果, 并将自己的结果集放到缓存中去。 如果你要对查询缓存的失效政策进行精确的控制,你必须调用`Query.setCacheRegion()`方法, 为每个查询指定其命名的缓存区域。 ``` List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger") .setEntity("blogger", blogger) .setMaxResults(15) .setCacheable(true) .setCacheRegion("frontpages") .list(); ``` 如果查询需要强行刷新其查询缓存区域,那么你应该调用`Query.setCacheMode(CacheMode.REFRESH)`方法。 这对在其他进程中修改底层数据(例如,不通过Hibernate修改数据),或对那些需要选择性更新特定查询结果集的情况特别有用。 这是对`SessionFactory.evictQueries()`的更为有效的替代方案,同样可以清除查询缓存区域。