1、什么是缓存?
缓存是指为了下降应用程序对物理数据源访问的频次,从而提升应用程序的运行性能的一种策略。
2、为何使用缓存?
ORM框架访问数据库的效率直接影响应用程序的运行速度,提高和优化ORM框架的执行效率相当重要。
Hibernate的缓存是提高和优化Hibernate执行效率的重要手段,因此学会Hibernate缓存的使用和配置是优化的关键。
3、缓存的演示,不一样Session没有使用到缓存。
4、Hibernate一级缓存
一、Hibernate一级缓存又成为Session缓存,会话级缓存。
二、经过Session从数据库查询实体时会把实体在内存中存储起来,下一次查询同一实体时再也不从数据库获取,而从内存中获取,这即便缓存。
三、一级缓存的生命周期是和Session相同,Session销毁,缓存也销魂。
四、一级缓存的的数据只在当前会话内有效。
5、一级缓存的API
一级缓存没法取消,用两个方法管理。
evict():用于将某个对象从Session的一级缓存中清除。
clear():用于将一级缓存中的全部对象所有清除
使用Query的list()方法,第二次查询内容仍是会从数据库再次查询数据。因此Query.list()方法不会使用缓存。
使用Query的iterate()方法,会从缓存中先检索是否有数据,若是没有,再进行数据库的查询。
list和iterate的区别:
List的获取方式为:List<Customers> list = query.list();
Iterator的获取方式:Iterator<Customers> it = query.iterate();
(1)
由于他们获取数据的方式不同,list()会直接查询数据库,iterator()会先到数据库中把id都取出来,而后真正要遍历某个对象的时候先到缓存中找,若是找不到,以id为条件再发一条sql到数据库,这样若是缓存中没有数据,则查询数据库的次数为n+1次
(2)list只查询一级缓存,而iterator会从二级缓存中查
(3)list方法返回的对象都是实体对象,而iterator返回的是代理对象
6、二级缓存
有些经常使用的数据,在一个session中缓存之后,咱们但愿它在其余的session中也可以使用,而不用再次缓存怎么办呢?
这种状况下,咱们就要使用更高级别的二级缓存,每一个session公用的缓存。
7、二级缓存的使用步骤:
一、添加二级缓存对应的jar包。
二、在Hibernate配置文件中添加Provider类的描述。
三、添加二级缓存的属性配置文件。
四、在须要被缓存的表所对应的映射文件中添加<cache />标签。
具体实现:
一、导入缓存依赖的jar包,ehcache.jar,commons-loggin.1.xxx.jar
二、添加缓存的配置文件ehcache.xml配置文件到src目录。
三、在hibernate.cfg.xml中添加配置信息。指定二级缓存的外部实现类。
<property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
四、在对应的hbm.xml文件中添加
<cache usage="read-only" />
cache标签的介绍:
usage:缓存模式:
read-only:表示只读事务模式。
transactional:
read-write:
nonstrict-read-write:
include:是否缓存延迟加载的属性
all表示缓存全部属性。
non-lazy:不缓存延迟加载的属性。
region:设置了名称后能够在缓存配置文件ehcache.xml中对这个缓存进行单独配置。
ehcache.xml
<defaultCache
maxElementsInMemory="10000" //表示缓存容许建立的最大对象数。
eternal="false" //表示缓存是否永久有效
timeToldleSeconds="120" //表示缓存的过时前的空闲时间,120秒
timeToLiveSeconds="1200" //表示缓存的超时时间 1200秒
overflowToDisk="true" /> //表示缓存溢出后是否保存在硬盘上。
8、二级二级缓存的总结:
一、二级缓存又称为”全局缓存“,应用级缓存
二、二级缓存中的数据可以使用范围是当前全部会话。
三、二级缓存是可插拔式缓存,默认是EHCache,还支持其余二级缓存组件:如Hashtable,OSCache,SwarmCache,JBoss TreeCache等。
二级缓存的适用场合。
一、不多被修改的数据。
二、不是很重要的数据,容许出现偶尔并发的数据。
三、不会被并发访问的数据。
四、参考数据。
9、一级缓存和二级缓存的对比