Hibernate 一级缓存和二级缓存

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 - 仅向二级缓存写数据,但不从二级缓存中读数据。


 


 

 




 

你可能感兴趣的:(Hibernate,一级缓存,二级缓存)