目录
一、一级缓存
二、二级缓存
三、EhCache
MyBatis缓存分两级缓存:
一级缓存(也称为本地缓存),默认已开启
二级缓存(也称为查询缓存),需要手动开启和配置,基于其他的缓存框架技术
在SqlSession中存在一个Map用于缓存查询出来的对象,可以提升性能。MyBatis把执行的方法和参数通过算法生成缓存的Key,将key和查询的结果value存入一个Map对象中。
注:一级缓存提升性能有限,因为SqlSession生命周期太短(和SqlSession相同),真正需要提升性能我们得使用二级缓存
不是所有的对象都适合放到二级缓存。
通常放入二级缓存的情况:
1)经常查询的数据
2)很少被修改的数据
3)不会被并发访问的数据
不适合放在二级缓存的情况:
经常被修改的数据
二级缓存有一些性能相关的属性:
1)命中率(总的从二级缓存中取得的数量/总的取的数量)
2)最在对象数
3)最大空闲时间
1、基本使用
一级缓存是SqlSession级别的,二级缓存是mapper级别的。
二级缓存是多个 SqlSession共享,作用域是mapper的同一个namespace
1)二级缓存默认是开启的
2)Mapper文件中设置二级缓存,使用cache元素
3)存于缓存中的对象必须实现java.io.Serializable接口:
2.缓存配置细节
1)映射文件中的所有select都会实用查询缓存
2)大多情况下,对于列表查询的select不缓存,因为只有SQL和查询参数完全相同,才会使用查询缓存(设置useCache="false")
3)一般的,只会对get做查询缓存
4)文件中所有的insert、update、delete语句都会刷新缓存,一般针对insert操作不需要刷新缓存(设置flushCache=false")
3.常见缓存属性
cache元素的常用属性:blocking,eviction,flushInterval,readOnly,size,type
eviction属性:缓存回收策略
[1]LRU 最近最少使用:移除最长时间不被使用的对象(缺省)
[2]FIFO 先进选出:按对象进入缓存的顺序来移除它们
[3]SOFT 软引用:移除基于垃圾回收器状态和软引用规则的对象
[4]WEAK 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushIntverval属性:刷新间隔,单位毫秒,可以设置为任意整数,缺省为没有刷新间隔,缓存仅仅调用语句时刷新
size属性:引用数目,正整数,缺省为1024,代表最多可以缓存多少个对象,太大容易导致内存溢出
realOnly属性:只读,true/false,默认false
true:只读缓存;会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很生要的 性能优势
false:读写缓存,会返回缓存对象的拷贝(通过序列化),这会慢一些,但安全
EhCache是一种广泛使用的开源java分布式缓存,具有快速、简单、多种缓存策略、缓存数据内存和硬盘两种级别的特点。缓存数据会在JVM重启的过程中写入硬盘,支持多缓存管理实例以及一个实例的多个缓存区域。
MyBatis中使用EhCache依赖的jar:
ehcache-core-2.6.8.jar
mybatis-ehcache-1.0.3.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar
ehcache.xml
共同的属性配置
1,maxElementsInMemory:该缓存池放在内存中最大的缓存对象个数;
2,eternal:是否永久有效,如果设置为true,内存中对象永不过期;
3,timeToIdleSeconds:缓存对象最大空闲时间,单位:秒;
4,timeToLiveSeconds:缓存对象最大生存时间,单位:秒;
5,overflowToDisk:当内存中对象超过最大值,是否临时保存到磁盘;
6,maxElementsOnDisk:能保存到磁盘上最大对象数量;
7,diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
8,memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。
默认策略是LRU(最近最少使用),可以设置为FIFO(先进先出)或是LFU(较少使用)
Mapper文件中设置查询缓存选用的缓存技术
源码下载
上一篇: MyBatis3.x整理:(四)对象关系映射
下一篇: MyBatis3.x整理:(六)MyBatis Generator