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)才会对查询结果进行缓存。