1、Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存。它可以缓存整个应用的持久化对象,所以双称为为“SessionFactory缓存“。

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