7.1什么是缓存

缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存
缓存:程序<--(内存)-->硬盘

7.2什么是二级缓存

1.hibernate 提供缓存机制:一级缓存、二级缓存
    a)一级缓存:session级别缓存,在一次请求***享数据。
    b)二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
2.SessionFactory的缓存两部分: 
    a)内置缓存:使用一个Map,用于存放配置信息,预定义SQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。
    b)外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存又称为二级缓存。

7.3二级缓存应用场景

1.适合放入二级缓存中的数据:
    a)很少被修改
    b)经常被访问
    c)不是很重要的数据, 允许出现偶尔的并发问题
2.不适合放入二级缓存中的数据:
    a)经常被修改
    b)财务数据, 绝对不允许出现并发问题

7.4二级缓存提供商

1.EHCache: 可作为进程(单机)范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。--支持集群。
2.OpenSymphony `:可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持
3.SwarmCache: 可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存
4.JBossCache:可作为集群范围内的缓存, 支持 Hibernate 的查询缓存

7.5使用ehcache

7.2.1导入jar包
    ehcache-1.5.0.jar
    commons-logging.jar
    backport-util-concurrent.jar

7.2.2开启二级缓存

7.2.3确定二级缓存提供商

7.2.4确定需要缓存内容

    a) 配置需要缓存的类

    b) 配置需要缓存的集合

7.2.5配置ehcache自定义配置文件

    更名为ehcache.xml,放到src目录下

7.2.6应用


7.6配置文件详解

maxElementsInMemory=“10000” //Cache中最多允许保存的数据对象的数量
external=“false” //缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 
timeToIdleSeconds=“1000”  //缓存数据钝化时间(设置对象在它过期之前的空闲时间,单位为秒)  
timeToLiveSeconds=“1000”  //缓存数据的生存时间(设置对象在它过期之前的生存时间)
overflowToDisk=“false” />    //内存不足时,是否启用磁盘缓存  
memoryStoreEvictionPolicy="LRU" //内存不足时数据对象的清除策略

ehcache中缓存的3种清空策略:
FIFO(first in first out):先进先出
LFU( Less Frequently Used):一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
LRU(Least Recently Used):最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

7.7查询缓存

1.查询缓存又称为三级缓存
2.查询缓存默认不使用。需要手动开启
3.查询缓存:将HQL语句与 查询结果进行绑定。通过HQL相同语句可以缓存内容。
    a)默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。
    b)查询缓存就是让Query可以从二级缓存获得内容。

使用步骤
1.开启二级缓存
2.在查询query对象,设置缓存内容(注意:存放和查询 都需要设置)
<property name="hibernate.cache.use_query_cache">true</property>