1.一级缓存
一级缓存时间很短,即session级别的缓存,和session的生命周期一致。只缓存实体对象。
(1)支持一级缓存的方法
get()、load()、iterate()【查询实体对象时】
(2)一级缓存的管理
一级缓存无法取消,但可以管理,通过session.clear()或者session.evict()方法
(3)如何避免一次性大量的实体数据的入库导致内存泄露
首先flush(),然后在clear()。
2.二级缓存
(1)二级缓存是缓存实体对象的,二级缓存称为进程级的缓存或者SessionFactory级的缓存,二级缓存可以被所有的session共享;二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
(2)配置与使用,以EHCache为例
A:将ehcache.xml文件拷贝到src下;
B:修改hibernate.cfg.xml文件,开启二级缓存,默认也是开启的,如下所示:
<property name="hibernate.cache.use_second_level_cache">true</property>
C:修改hibernate.cfg.xml文件,指定缓存产品提供商,如下所示:
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
D:指定哪些实体类使用二级缓存:2种方法
方法一:在对应的实体映射文件中,使用cache标签,加入如下代码,在id之前。
<cache usage="read-only"/>
usage(必须)说明了缓存的策略: transactional、read-write、nonstrict-read-write或read-only。
当然还有其他的属性。
方法二:在hibernate.cfg.xml文件中使用class-cache标签,在mapping下,如下所示:
<class-cache usage="read-only" class="实体类"/>
(3)二级缓存的管理
通过SessionFactory的evict()方法,语法如下:
sessionFactory.evict(Cat.class, catId); //evict a particular Cat sessionFactory.evict(Cat.class); //evict all Cats
(4)一级缓存和二级缓存的交互
CacheMode参数用于控制具体的Session如何与二级缓存进行交互。
如:
session.setCacheMode(CacheMode.GET);
CacheMode.NORMAL - 从二级缓存中读、写数据。 默认!!
CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。