转载注明出处:http://www.cnblogs.com/xiaoming0601/p/5882980.html
一、什么是缓存:
并不是指计算机的内存或者CPU的一二级缓存;缓存是指为了降低应用程序对物理数据源访问的频次从而提高应用程序的运行性能的一种策略。
二、为什么使用缓存:
1.ORM框架访问数据库的效率直接影响应用程序的运行速度,提升和优化ORM框架的执行效率至关重要。
2.Hibernate的缓存是提升和优化Hibernate执行效率的重要手段,所以学会Hibernate缓存的使用和配置是优化的关键。
3.评判一个ORM框架是否优秀,访问数据库的频次就一个重要的标准。
三、介绍一级缓存:
1.Hibernate一级缓存又称为"Session缓存","会话级缓存"
2.通过Session从数据库查询实体时把实体在内存中存储起来,下一次查询同一实体时不再从数据库获取,而是从内存中获取,这就是缓存
3.一级缓存的生命周期和Session相同;Session销毁,他也销毁
4.一级缓存中的数据可适用范围在当前会话之内
四、Hibernate一级缓存API:
一级缓存是Hibernate的默认缓存,无法取消,用两个方法管理:
1、evict():用于将某个对象从Session的一级缓存中清除。
2、clear():用于将一级缓存中的所有对象全部清除。
五.query.list()和query.iterator()方法的区别:
1.list每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存),在一个session中使用两次list()方法,都会发送查询语句,证明list()方法不使用缓存;
2.iterator首先通过一条语句取出所有数据的id,然后通过id在hibernate的一级缓存中查找是否存在该对象,如果存在则直接取出,如果没有则再次发出一条sql语句通过id取得对象(并且加入到缓存中),这样如果所有的id在缓存中都没有的话就会出现n+1条sql语句的问题。
3.所以两者需要合理的结合使用,最大提高性能。
4.使用list()后,数据在一级缓存中存在,再同一个session中使用iterator()的话,不会发送数据库语句,证明iterator()使用一级缓存,在一个session中使用两次list()方法,都会发送查询语句,证明list()方法不使用缓存
六.二级缓存的介绍
1.二级缓存又称为“全局缓存”、“应用级缓存”;
2.二级缓存中的数据可使用范围是当前应用的所有会话;
3.二级缓存是可插拔式缓存,默认是EHCache,还支持其他二级缓存组件如:HashTable、OSCache、SwarmCache等。
七.二级缓存(每个session共用的缓存)
1.每个session共用的缓存
2.二级缓存不是默认开启的,需要手动配置
a.导入jar包
b.加入ehcache.xml配置文件
maxElementsInMemory="10000" 表示缓存中允许创建的最大对象数。
eternal="false" 表示缓存中对象是否为永久的。
timeToIdleSeconds="120" 表示缓存数据钝化时间(即对象在它过期前的空闲时间)。
timeToLiveSeconds="120" 表示缓存数据生存时间(即对象在它过期前的生存时间)。
overflowToDisk="true" 表示溢出之后是否存储在硬盘上。
c.hibernate.cfg.xml中配置指定二级缓存的外部实现类
d.xx.hbm.xml配置文件中配置指定使用二级缓存
<cache usage="read-only" region="Employee(自定义命名)"/>只读
(region="Employee(自定义命名)":在ehcache.xml文件中自定义配置)
八.通常具有以下特征的数据放入二级缓存
1.很少被修改的数据;
2.不是很重要的数据,允许偶尔出现并发的数据;
3.不会被并发访问的数据;
4.参考数据
九.一二级缓存的对比
十.总结
1.Hibernate的缓存能提高检索效率;
2.Hibernate的缓存分为一级缓存和二级缓存,一级缓存是会话级缓存,二级缓存是应用级缓存;
3.Hibernate的缓存在提高检索的同时,也会增加服务器的消耗,所以注意缓存的使用策略。