1.
1.1
即Hibernate将数据临时存放在内存中,以便加快数据的存取速度。为此,我们可以想象,缓存的实现,就类似于一个Map对象,首先需要一个key,以便定位相应被缓存的数据,而它的value值,便是被缓存的数据。
1.2
即session级别的缓存,随着session的关闭而消失,load/iterator操作,会从一级缓存中查找数据,如果找不到,再到数据库里面查找。Query.list操作,如果没有配置查询缓存,将直接从数据库中获取数据。
1.3
即SessionFactory级别的缓存。默认的情况下是打开的。这是一个全局缓存策略。它可以对对象的数据进行全局缓存。
1.4
即对查询的结果集进行缓存处理,以便下次相同条件相同HQL的情况下可以直接从缓存中获取数据。
2.
2.1.1
需要更改hibernate配置文件:
1、
a)
2、
a)
2.1.2
为了让hibernate对对象进行缓存,你必须指定需要缓存哪些类的对象,这有两种方法可以达到这个目的:
1、
2、
如果你打开了对对象的缓存,那么,所有对这个对象的查询操作的结果,都会被缓存起来。Hibernate将使用对象的键值作为缓存的key值,对象的数据作为缓存的value值。
打开了对象缓存,只有在对对象进行查询操作的时候,才会起作用,如createQuery(“from
Student”).iterate()
2.1.3
缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read-write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)
3.
查询缓存的作用,是对list操作的查询结果集进行缓存!
我们使用list操作的时候,如果启用了查询缓存,hibernate将根据当前查询的HQL语句(及其参数值)计算出一个缓存的key值;查询结果集,将作为缓存的value值(但如果查询结果集是一个对象结果集的话,其缓存的value值是对象的ID集合,而不是对象集合本身)。
可以在hibernate配置文件中添加:
true
以便打开查询缓存。
查询缓存,对对象查询,将缓存其ID列表;对普通查询,将缓存整个数据集合。所以,对于对象查询,需要配合二级缓存来使用。
在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。
4.
4.1
这个方法,用于加载某个对象。如果打开了二级缓存,加载的对象数据将会被缓存。缓存的key是对象的ID,缓存的value是对象的值。
4.2
使用iterate进行查询,分成两种不同的情况:
1、
2、
4.3
查询缓存只对list操作起作用。
使用List进行查询,也分成两种情况:
1、
a)
b)
2、
a)
b)
4.4
Session接口通过CacheMode来定制与二级缓存之间的交互方法:
5.
抓取策略,即如何获取数据的策略。
下面以下述模型为例:
班级与学生模型,之间是一对多双向关联:
·
Hibernate: select classes0_.id as id7_, classes0_.name as name7_
from T_Classes classes0_ where classes0_.id in (1 , 22)
Hibernate: select students0_.classesid as classesid1_,
students0_.id as id1_, students0_.id as id8_0_, students0_.name as
name8_0_, students0_.sex as sex8_0_, students0_.classesid as
classesid8_0_ from T_Student students0_ where
students0_.classesid=?
Hibernate: select students0_.classesid as classesid1_,
students0_.id as id1_, students0_.id as id8_0_, students0_.name as
name8_0_, students0_.sex as sex8_0_, students0_.classesid as
classesid8_0_ from T_Student students0_ where
students0_.classesid=?
可见,总共发出:第一,查询Classes的数据;第二,因为查询结果集中有两个Classes对象,所以针对每个对象,都发出了一个查询语句以便查询其students集合的数据。
以下是hibernate生成的SQL语句:
Hibernate: select classes0_.id as id7_, classes0_.name as name7_
from T_Classes classes0_ where classes0_.id in (1 , 22)