查询缓存:
首先明确查询缓存缓存的是什么?缓存的
key
是
HQL
语句与参数,缓存的
value
则是:
1、
如果查询的是普通结果集,则缓存这些结果集
2、
如果查询的是实体对象,则缓存的是实体对象的
ID
列表
3、
查询缓存它也是
SessionFactory
级别的缓存,由
sessionFactory
管理
现在看看使用查询缓存的三个步骤:
1、
在
Hibernate
配置文件中,启用查询缓存
<!--
配置打开查询缓存
-->
<property
name="hibernate.cache.use_query_cache">true</property>
2、
提供查询缓存的策略提供商,一般跟二级缓存的提供商是一样的
<!--
指定二级缓存和查询缓存的具体实现!
-->
<property
name="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider</property>
3、
查询之前调用
Query.setCacheable(true)
,这样查询缓存就起作用了。举个例子如下:
session.beginTransaction();
//查询缓存是SessionFactory级别的缓存
String hql = "select p.id,p.name from Person p";
List persons = session.createQuery(hql)
.setCacheable(true) //允许查询缓存!
.list();
for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
Object[] datas = (Object[]) iterator.next();
System.out.println(datas[0]+","+datas[1]);
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
//session关闭之后,当前session对象中的一级缓存已经被清空
session.close();
}
Session session2 = HibernateUtil.openSession();
try{
session2.beginTransaction();
String hql = "select p.id,p.name from Person p";
//不发出sql语句
List persons = session2.createQuery(hql)
.setCacheable(true) //允许查询缓存!
.list();
for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
Object[] datas = (Object[]) iterator.next();
System.out.println(datas[0]+","+datas[1]);
}
session2.getTransaction().commit();
接下来继续研究下:如果查询的参数不一致呢?
session.beginTransaction();
//如果查询参数不一样,最好不要使用查询缓存
String hql = "select p.id,p.name from ContactPerson p where p.name like ?";
List persons = session.createQuery(hql)
.setParameter(0, "%巴%")
.setCacheable(true) //允许查询缓存!
.list();
session2.beginTransaction();
String hql = "select p.id,p.name from ContactPerson p where p.name like ?";
List persons = session2.createQuery(hql)
.setParameter(0, "%特%")
.setCacheable(true) //允许查询缓存!
.list();
上面会发两条
sql
语句,因为查询的参数不一致。
查询缓存的
1+N
问题见
1+N
问题的文章!
总结:
-
要注意,查询缓存一般配合二级缓存一起使用
-
如果查询条件及其参数非常容易发生变化,请慎用查询缓存
-
注意理解查询缓存中的
N
个查询的问题!
分享到:
相关推荐
Hibernate缓存原理及调优策略 Hibernate缓存原理调优策略
Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。
讲述如何设置和使用hibernate缓存
缓存是介于应用程序和物理数据之间的,其作用是为了降低应用程序对物理数据访问的频次从而提高应用系统的性能。缓存思想的提出主要是因为对物理数据的访问效率要远远低于对内存的访问速度,因而采用了将部分物理数据...
NULL 博文链接:https://wangrusheng5200.iteye.com/blog/898231
hibernate的缓存机制以及优化策略
Hibernate是一个持久化框架,经常需要访问数据库。如果我们能够降低应用程序对物理数据库访问的频次,那会提供应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序运行时先从缓存中读写数据。
Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。 2.3.2. 什么样的数据适合存放到第二级缓存中? 1 很少被修改的数据 2 不是很...
Hibernate缓存管理,全面,易懂...
NULL 博文链接:https://364232252.iteye.com/blog/2369161
基于Hibernate的查询效率的探讨,张文英,安伟莲,本文首先介绍了Hibernate的原理及查询机制,然后从制定合理的缓存策略和应用延迟加载两方面来提高Hibernate的查询效率。
doc格式。当多个并发的事务同时访问持久化层的缓存的相同数据时,会引起并发问题,必须采用必要的事务隔离措施。在进程范围或集群范围的缓存...因此可以设定四种类型的并发访问策略,每一种策略对应一种事务隔离级别。
多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 6. 可以通过RMI、可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多...
当我们使用二级缓存的时候,如果并发策略为:read-only,那么只能对持久化对象进行查询,不能对其进行修改.这是因为,Hibernate的并发策略 所决定的. 当我们只对数据进行查询的时候,可以将并发策略设置为:read-...
Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制
001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 ...028 hibernate 缓存(性能优化策略) 029 hibernate 抓取策略
19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 ...
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点...3)多种缓存策略 4)缓存数据有两级:内存和磁盘,因此无需担心容量问题 5)缓存数据会在虚拟机重启的过程中写入磁盘 6)可以通过 RMI、可插入 API