缓存同步决定了数据对象在缓存中的存取规则;为了使得缓存调度遵循正确的应用级事务隔离机制,必须为每个实体类指定相应的缓存同步策略;
Hibernate中提供4种内置的缓存同步策略;
- read-only(只读缓存)
对于不会发生改变的数据,可使用只读型缓存;
<class name="com.keith" mutable="false"> <cache usage="read-only"/> .... </class>
- nonstrict-read-write(非严格读/写)
程序的并发访问下的数据同步要求不是非常严格,且数据更新操作,频率较低,可采用本项;
- read-write(严格的读/写)
基于时间戳判定机制,实现了“read committed” 事务隔离等级,可用于对数据库同步要求严格的情况,不支持分布式缓存;
<class name="com.keith" .... > <cache usage="read-write"/> .... <set name="kittens" ... > <cache usage="read-write"/> .... </set> </class>
- transactional(事务型缓存)
必须运行在JTA事务环境中;实现了Repeatable Read事务隔离等级,有效地保障数据的合法性,适用于关键数据的缓存;目前在Hibernate内置的的Cache中,只有JBoss Cache支持事务性的Cache实现;
在事务型缓存中,缓存的相关操作也被添加到事务之中(此时的缓存,类似于一个内存数据库),如果由于某些原因导致事务失败,将会连同缓冲池中的缓存数据一起回滚到事务开始之前的状态;
不同的缓存实现,可支持的缓存同步策略也各不相同;
Cache | read-only | nonstrict-read-write | read-write | transactional |
Hashtable (not intended for production use) | yes | yes | yes | |
EHCache | yes | yes | yes | |
OSCache | yes | yes | yes | |
SwarmCache | yes | yes | ||
JBoss Cache 1.x | yes | yes | ||
JBoss Cache 2 | yes | yes |