Hibernate二级缓存中的缓存对象可以被整个应用的Session对象共享,即使关闭当前Session对象,新建的Session仍可使用。使用Hibernate对象的二级缓存之后查询数据,Session对象会首先在一级缓存中查找有无缓存中的数据被命中。如果没有,则查找二级缓存。如果,则直接返回所命中的数据;否则查询数据库。
如果在Hibernate要使用二级,则需要通过第三方组件实现。Hibernate提供了org.hibernate.cache.CacheProvider接口来作为缓存组件与Hibernate之间的适配器。
2、二级缓存的策略
在Hibernate中,二级缓存数据有并发访问控制的问题,Hibernate提供了4种管理二级缓存策略:
(1)、只读缓存(read-only)
只读缓存是最简单且高效的缓存策略,缓存的是只读对象,不能修改。如果hibernate应用中持久化的对象或者集合对象只需要读取不需要修改,则可以使用这个策略。
(2)、读/写缓存(read-write)
读/写缓存策略适合缓存对象既要读取,又要更新修改的Hibernate应用。如果使用Serializable级别的事务隔离级别,则不能使用这种缓存策略。如果在分布式的应用使用这种策略,则需要底层的缓存组件支持锁定机制。
(3)、不严格的读/写缓存(nonstrict-read-write)
不严格
的读/写策略适合被缓存对象读取频繁且极少更新的Hibernate应用,它不保证两个事务并发修改同一个缓存数据的一致性,在性能上要比读/写策略略高。
(4)、事务缓存(transaction)
事务缓存策略提供缓存数据的全面事务支持,只能用于JTA环境中。
各种缓存组件对缓存策略的支持如下:
缓存组件 read-only nostrict-read-write read-write transaction
Hashtable Y Y Y
EHCache Y Y Y
OSCache Y Y Y
JBoss Cache 1.x Y Y
JBoss Cache 2 Y Y
SwarmCache Y Y