Hibernate缓存有两级:
一级缓存 session级别的缓存
概念
它属于事务范围的缓存。它只存在于Session的生命周期。程序调用save(),update(),saveorupdate()等方法及调用查询接口 list,filter,iterate时,如果session缓存没有相应的对像,就会自动加入到一级缓存里。
session关闭时,其管理的一级缓存也会被清除。
一级缓存不能进行配置,不能卸载。
一级缓存的内部结果就是map
方法
- session.evict() : 将某个对象从Session的一级缓存中清除
- session.clear(): 将一级缓存中的所有对象清除
二级缓存 SessionFactory级别的缓存
这一级别的缓存可以配置和更改,动态的加载和卸载,属于进程级缓存,可以让所有的session共享。
二级缓存的生命周期与SessionFactory一致,由SessionFactory管理二级缓存。
二级缓存是HashTable结构,只能保持实体对象,不能保存属性。
二级缓存默认是打开的。设置的方式是:
hibernate.cache.use_query_cache=true
或者在hibernate.cfg.xml设置
配置方式:
hibernate.cfg.xml
<!-- 指明二级缓存的提供商 -->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- 是否开启二级缓存,true开启二级缓存,false关闭二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 指定把那个对象放入二级缓存当中 -->
<class-cache class="com.tarena.po.Student" usage="read-only"/>
ehcache.xml
//在该二级缓存中,最多可以缓存对象的数量
maxElementsInMemory="1000"
//缓存在二级缓存中的对象是否永远都有效,一般配置为false
eternal="true"
//"钝化":两次访问该二级缓存中对象的,间隔时间
timeToIdleSeconds="120"
//二级缓存中的对象从创建到消亡的时间
timeToLiveSeconds="120"
//如果超过缓存的访问,可以写入到硬盘上的
overflowToDisk="true"
二级缓存的管理
使用SessionFactory来管理我们的二级缓存
首先修改HibernateUtil,添加获得SessionFactory的方法
SessionFactory factory = HibernateUtil2.getSessionFactory();
factory.evict(Student.class,1);//去掉二级缓存中id为1的student对象
factory.evict(Student.class);//去掉二级缓存中所有的student对象
缓存读取流程
Hibernate将第一次读取的内容放到缓存
如果数据库被其它程序修改,Hibernate这时读取的数据仍是缓存数据。(先从一级缓存读,如果没有则从二级缓存读)。
查询缓存
另外Hibernate为查询结果提供了一个查询缓存,依赖于第二级缓存。
查询用来保存属性的,对实体结果集只保存id
查询缓存的生命周期,只有当前表发生改变,查询缓存的生命周期结束
使用查询缓存
修改hibernate.cfg.xml文件,开启查询缓存
<!-- 是否开启查询缓存,true开启查询缓存,false关闭查询缓存 -->
<property name="cache.use_query_cache">true</property>
在Query对象中必须手动开启查询缓存
createSQLQuery创建的SQLQuery对象query中设置
query.setCacheMode(CacheMode.IGNORE);
读取数据时,不和二级缓存交换数据,直接读取数据库