本节主要介绍 Hibernate 二级缓存的并发访问策略和常用的四种插件。
两个并发的事务同时访问持久层缓存中的相同数据时,可能会出现各类并发问题,所以也需要采用必要的隔离措施解决这些问题。
由于在二级缓存中也会出现并发问题,因此在 Hibernate 的二级缓存中,可以设定以下四种类型的并发访问策略,以解决这些问题。每一种访问策略对应一种事务隔离级别,具体介绍如下:
提供 Serializable 事务隔离级别,对于从来不会被修改的数据,可以采用这种访问策略。
提供 Read Committed 事务隔离级别,对于经常读但是很少被修改的数据,可以采用这种隔离类型,因为它可以防止脏读。
不保证缓存与数据库中数据的一致性,提供 Read Uncommitted 事务隔离级别,对于极少被修改,而且允许脏读的数据,可以采用这种策略。
仅在受管理环境下使用,它提供了 Repeatable Read 事务隔离级别。对于经常读但是很少被修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读。
Hibernate 二级缓存需要通过配置二级缓存的插件才可以正常使用,常用的插件有四种,具体如下:
可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,对 Hibernate 的查询缓存提供了支持。
可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘;它提供了丰富的缓存数据过期策略,并且对 Hibernate 的查询缓存提供了支持。
可作为集群范围内的缓存,但不支持 Hibernate 的查询缓存。
可作为集群范围内的缓存,支持 Hibernate 的查询缓存。
以上的四种缓存插件所支持的并发访问策略如表 1 所示(√代表支持)。
二级缓存的常用插件 | 只读型 | 非严格读写 | 读写型 | 事务型 |
---|---|---|---|---|
EHCache | √ | √ | √ | |
OSCache | √ | √ | √ | |
SwarmCache | √ | √ | ||
JBossCache | √ | √ |
在 Hibernate 中,不是所有的数据都适合放置在二级缓存中,一般情况下,可以将很少被修改的、不重要的且不会被并发访问的数据放置在二级缓存中。