Cache主要是为了提高系统的性能的。HIbernate由于直接JDBC的一个方面就是因为它的缓冲机制。Hibernate有两级缓存。
第一级缓存就是事务级缓存。很重要也是必须的。这一级缓存的对象是在persistence context中缓存的持久化对象。这级缓存可以保证对应于数据库同一行的对象只有一个实例。因此不存在并发的问题。
第二级缓存是进程级别的缓存。这里缓存的对象为同一个session factory生成的所有persistence context共享。因为是多线程共享,所以存在并发的问题。同一个对象在不同的persistence context里也是不同的copy。基于并发的原因,只有那些经常被读取,而
很少被变更的对象才适合进入这一级缓存。所以,这一级缓存是可选的,并且可以配置到具体的class以及class里面的集合属性。
在配置hibernate缓存的时候有两步。第一步是并发策略,有四种:Transactional,Read-write,Nonstrict-read-write和Read-only。依次并发要求越来越松,性能也越来越好。要根据要缓存对象的特性选择。第二步是选择物理的cache-provider。通常是EHCache, OSCache还有JbossCache等。不同的provider也不一定支持全部的并发策略,要注意选择。根据不同的对象特性,在cache-provider的配置里,也要配置不同的缓冲策略,包括
缓存数量,要不要disk缓存,闲置丢出时间以及超时时间等等。
最为典型的可以被缓存的例子就是产品目录Category。产品目录一般记录比较少,很少修改,几周甚至几个月才可能被修改。这样的对象又经常被查看和检索。我们就需要将所有的Category记录缓存在二级缓存里面。并发策略可以用Nonstrict-read-write。
=====================================================
欢迎大家一起讨论,我会持续总结更新。。。
=====================================================
第一级缓存就是事务级缓存。很重要也是必须的。这一级缓存的对象是在persistence context中缓存的持久化对象。这级缓存可以保证对应于数据库同一行的对象只有一个实例。因此不存在并发的问题。
第二级缓存是进程级别的缓存。这里缓存的对象为同一个session factory生成的所有persistence context共享。因为是多线程共享,所以存在并发的问题。同一个对象在不同的persistence context里也是不同的copy。基于并发的原因,只有那些经常被读取,而
很少被变更的对象才适合进入这一级缓存。所以,这一级缓存是可选的,并且可以配置到具体的class以及class里面的集合属性。
在配置hibernate缓存的时候有两步。第一步是并发策略,有四种:Transactional,Read-write,Nonstrict-read-write和Read-only。依次并发要求越来越松,性能也越来越好。要根据要缓存对象的特性选择。第二步是选择物理的cache-provider。通常是EHCache, OSCache还有JbossCache等。不同的provider也不一定支持全部的并发策略,要注意选择。根据不同的对象特性,在cache-provider的配置里,也要配置不同的缓冲策略,包括
缓存数量,要不要disk缓存,闲置丢出时间以及超时时间等等。
最为典型的可以被缓存的例子就是产品目录Category。产品目录一般记录比较少,很少修改,几周甚至几个月才可能被修改。这样的对象又经常被查看和检索。我们就需要将所有的Category记录缓存在二级缓存里面。并发策略可以用Nonstrict-read-write。
=====================================================
欢迎大家一起讨论,我会持续总结更新。。。
=====================================================