hibernate二级缓存(一)一级缓存与二级缓存
1.hibernate一级缓存
hibernate的一级缓存是session级别的缓存,一级缓存hibernate默认启用且不能被卸载,一个事务内有效。
特点:
-
使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据);
-
Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;
-
一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。
-
当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session缓存中;
-
session的缓存是由hibernate维护的,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的evict/clear方法操作
-
缓存相关的方法(在什么情况下使用上面方法呢?批量操作情况下使用,如Session.flush();先与数据库同步,Session.clear();再清空一级缓存内容):
session.flush();让一级缓存与数据库同步; session.evict();清空一级缓存中指定的对象; session.clear();清空一级缓存中所有的对象;
综上: 一级缓存的生命周期和session的生命周期一致,当前session一旦关闭,一级缓存就消失了,因此一级缓存也叫session级的缓存或事务级缓存,一级缓存只存实体对象,它不会缓存一般的对象属性(查询缓存可以),即当获得对象后,就将该对象缓存起来,如果在同一session中再去获取这个对象时,它会先判断在缓存中有没有该对象的id,如果有则直接从缓存中获取此对象,反之才去数据库中取,取的同时再将此对象作为一级缓存处理。
2.二级缓存
Hibernate的二级缓存又称为"SessionFactory的缓存",由于SessionFactory对象的生命周期和应用的整个过程对应,他是可选的,是一个可配置的插件,默认情况下SessionFactory不会启用这个插件。
由于二级缓存是被各session共享的,那么多个事务或者说线程同时访问修改二级缓存可能会会造成数据不一致问题。所以二级缓存只适合多读少写的场景。
那么什么样的数据适合放在二级缓存中呢?
- 多读少写的数据
- 不是很重要的数据
- 常量数据
什么样的数据不适合放在二级缓存中呢?
- 经常被修改的数据
- 绝对不允许出现并发访问的数据。如财务数据,绝对不允许出现并发
- 与其他应用共享的数据
3. 二级缓存的配置
这里只展示纯hibernate的二级缓存配置,如果要如spring结合,请参考spring sessionFactory配置里面的hibernate二级缓存参数。
下面的配置是基于hibernate5.3.7.Final版本
3.1 SessionFactory的配置
该版本的SessionFactory获取的最新方式如下:
public class SessionFactoryUtil {
private SessionFactory sessionFactory;
public Se