Hibernate学习之---二级缓存和查询缓存

时间:2021-06-10 00:48:04

Hibernate包括两个级别的缓存:

  • 默认总是启用的Session级别的一级缓存。
  • 可选的SessionFactory级别的二级缓存。

一旦在应用中开启了二级缓存,当Session需要抓取数据时,Session将会先查找一级缓存,再查找二级缓存,只有当一级缓存和二级缓存中都没有需要抓取的数据时,才会在查找底层数据库。

1.开启二级缓存

    hibernate.cfg.xml
<property name="hibernate.cache.use_second_level_cache">true<property/>

一旦开启了二级缓存,并且设置了对某个持久化实体类启动缓存,SessionFacory就会缓存应用访问过的该实体类的每个对象,除非缓存的数据超出缓存空间。

在hibernate.cfg.xml文件中设置开启缓存之后,还需要设置使用哪种二级缓存实现类。

    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

EhCacheRegionFactory就是Hibernate常用的缓存实现类。

Hibernate二级缓存的用法:

  • 在hibernate.cfg.xml文件中开启二级缓存。需要做两件事情:1.设置启用二级缓存;2.设置二级缓存的实现类。
  • 复制二级缓存的JAR包。
  • 将缓存实现所需的配置文件添加到系统的类加载路径中。
  • 设置对哪些实体类、实体的哪些集合属性启用二级缓存,方式为:

    • 修改要使用缓存的持久化类文件,使用Hibernate提供的@Cache注解修饰该持久化类,或使用该注解修饰集合属性。
    • 在hibernate.cfg.xml文件中使用<class-cache.../><collection-cache.../>元素对指定的持久化类、集合属性启用二级缓存。

2.管理缓存和统计缓存

Session级别的一级缓存是局部缓存,它只对当前Session有效;SessionFactory级别的二级缓存是全局缓存,它对所有的Session都有效。
在某些特殊情况下,可以调用Session的evict(Object object)方法,将该方法或集合从一级缓存中剔除。
为了判断某个对象是否处于Session缓存中,可以借助于Session提供的contains(Object object)方法,该方法返回一个boolean值。
Session的clear()方法把所有对象彻底清除。
SessionFactory提供了一个getCache()方法,该方法的返回值是Cache对象,通过该对象即可操作二级缓存中的实体、集合等。

3.使用查询缓存

一级、二级缓存都是对整个实体进行缓存,它不会缓存普通属性,如果想对普通属性进行缓存,则可以考虑使用查询缓存。
对于查询缓存,它缓存的key就是查询所用的HQL或SQL语句。需要指出的是,查询缓存不仅要求所使用的HQL语句、SQL语句相同,甚至要求所传入的参数也相同,Hibernate才能直接从查询缓存中取得数据。
查询缓存默认也是关闭的,为了开启查询缓存,必须在hibernate.cfg.xml文件中增加:

<property name="hibernate.cache.use_query_cache">true</property>

除此之外,还必须调用Query对象的setCacheable(true)才会对查询结果进行缓存。