Hibernate的一级缓存又称为Session缓存,其适用范围是在当前的会话之中,其生命周期和Session相同,随着Session的销毁,一级缓存也会随之销毁。一级缓存是不能取消的,Hibernate默认会采取一级缓存。 工作原理:通过Session冲数据库查询的实体会被存储在程序的内存当中,下次查询同一实体的时候不再从数据库中获取,而是直接从应用程序内存获取。 Hibernate一级缓存API: evict()清除一级缓存的指定对象 clear()清除一级缓存的所有对象 query().list与query().iterator的区别: query().list无法使用一级缓存。 query().iterator是查询主键id,使用query.iterator()会在执行完查找id的sql查询后,分别向数据库再次执行查询(缓存找不到id记录),如果前面使用了query.list()再调用query.iterator()则会在缓存中查找id并返回查询的值。
二级缓存开启步骤 1.导入相对应的ehcache.JAR包 2.导入ehcache.xml文件到src路径下 3.在 hibernate.cfg.xml中配置<property name="cache.provider_class">外部实现类</property> 4.在实体类的配置文件中(.hbm.xml) ,配置<cache usage="read-only"></cache> usage:表示事务模式 region:可以为指定region属性名的所有表进行统一缓存策略配置
二级缓存的并发访问策略
•两个并发的事务同时访问持久层的缓存的相同数据时,也有可能出现各类并发问题.
•二级缓存可以设定以下 4 种类型的并发访问策略,每一种访问策略对应一种事务隔离级别
–非严格读写(Nonstrict-read-write):不保证缓存与数据库中数据的一致性.提供ReadUncommited事务隔离级别,对于极少被修改,而且允许脏读的数据,可以采用这种策略
–读写型(Read-write):提供ReadCommited数据隔离级别.对于经常读但是很少被修改的数据,可以采用这种隔离类型,因为它可以防止脏读
–事务型(Transactional):仅在受管理环境下适用.它提供了RepeatableRead事务隔离级别.对于经常读但是很少被修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读
–只读型(Read-Only):提供Serializable数据隔离级别,对于从来不会被修改的数据,可以采用这种访问策略
管理 Hibernate的二级缓存
•Hibernate的二级缓存是进程或集群范围内的缓存
•二级缓存是可配置的的插件,Hibernate允许选用以下类型的缓存插件:
–EHCache: 可作为进程范围内的缓存,存放数据的物理介质可以使内存或硬盘,对Hibernate的查询缓存提供了支持
–OpenSymphonyOSCache:可作为进程范围内的缓存,存放数据的物理介质可以使内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持
–SwarmCache: 可作为集群范围内的缓存,但不支持Hibernate的查询缓存
–JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存
二级缓存的介绍: 1.二级缓存又称为“全局缓存”,“应用级缓存” 2.二级缓存中的数据可适用方位是当前应用的所有会话,不会虽然某一个session会话的关闭而关闭,而是随着整个sessionFactory的关闭而关闭 3.二级缓存是可插拔式缓存,默认是EHCache,还支持其他二级缓存组件 二级缓存的适用场景: 1.很少被修改的数据 2.不是很重要的数据,允许出现偶尔并发的数据 3.不会被并发访问的数据 4.参考数据 一二级缓存的对比: 如图 http://www.imooc.com/video/9018
总结: 1.Hibernate的缓存能提高检索效率 2.Hibernate的缓存分为一级缓存和二级缓存,一级缓存是会话级缓存,二级缓存是应用级缓存 3.Hibernate的缓存在提高检索的同时,也会增加服务器的消耗,所以要注意缓存的使用策略。
http://blog.csdn.net/ochangwen/article/details/52601527