Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载,它只能被在session的声明周期中存在,被称作事务缓存。由于session对象的生命周期通常对应一个数据库事务或者一个应用事务,所以一般使用一级缓存是很少引起并发问题的。
当多个并发的事务同时访问相同数据的时候就会容易出现并发问题。
二级缓存是进程范围的缓存,所以二级缓存可能会出现并发问题,针对二级缓存的这个情况,有以下四种并发访问策略来预防,一种策略对应一种事务隔离级别。
事务型:对于经常被读但是修改很少的数据,可以采用这种隔离类型,它可以防止脏读和不可重复读这类的并发问题。对应Repeatable Read事务隔离级别(可重复读)。
读写型:和事务型一样,它可以防止脏读,但是两者的应用场景不同。它对应Read Committed事务隔离级别(读已提交数据)。
非严格读写型:针对于极少被修改,并且允许偶尔脏读的数据,可以采用这个策略。它不能保证缓存与数据库中数据的一致性。
只读型:对于从来不会修改的数据,可以使用这种策略。
事务型并发访问策略是事务隔离级别最高,只读型的隔离级别最低。事务隔离级别越高,并发性能就越低。
一级缓存声明期很短,
主要是保持Session内部数据状态同步
,并且一级缓存的命中率是很低的,并非是为了大幅提高系统性能所提供的。
hibernate会自行维护二级缓存中的数据,以保证缓存中的数据和数据库中的真实数据的一致性!
hibernate二级缓存的查询过程如下:
1)、条件查询的时候,总是先查出所有的字段,一次获取所有的数据对象,并放到缓存中。
2)、当查询数据的时候,先查询一级缓存中有没有,如果没有就查询二级缓存,如果都没有就查询数据库。
适合使用二级缓存的情况如下:1、数据不会被第三方修改:2、数据大小在可接收范围之内3、数据更新频率低4、非关键数据。