MyBatis 的缓存
1. MyBatis 的一级缓存
一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据就会从缓存中直接获取,不会从数据库中重新访问。
示例:
MyBatis 的一级缓存存在失效的情况,主要有以下四种:
- 不同的SqlSession对应不同的一级缓存同一个SqlSession但是查询条件不同同一个SqlSession两次查询期间执行了任意一次增删改的操作同一个SqlSession两次查询期间手动清除了缓存
2. MyBatis 的二级缓存
二级缓存是 SqlSessionFactory 级别,通过同一个 SqlSessionFactory 创建的 SqlSession 查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取。
二级缓存是需要手动开启的,开启的条件如下:
- 在核心配置文件中,设置全局配置属性 cacheEnabled=“true” ,默认为true,不需要设置。
- 在映射文件中设置标签 < cache />
- 二级缓存必须在SqlSession关闭或提交之后生效查询的数据所转换的实体类类型必须实现序列化接口
示例:
同样的MyBatis的二级缓存也会存在失效的情况:
两次查询之间执行了任意的增删改操作,都会使一二级缓存失效
3. 二级缓存的相关配置
二级缓存 < cache /> 中可以设置一些属性,如下:
eviction:缓存回收策略:默认是LRU
LRU (Least Recently Used) 最近最少使用的,移除最长时间不被使用的对象。
FIFO (First in First out) 先进先出 按对象进入缓存的顺序来移除他们
SOFT 软引用 移除基于垃圾回收器状态和软引用规则的对象
WEAK 弱引用 更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushInterval:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新时间间隔,缓存尽在调用增删改操作语句时刷新
size:引用数目,正整数
代表缓存最多可以储存多少个对象,太大容易导致内存溢出
readOnly:只读 true/false
true 只读属性,会给所有调用者返回缓存对象相同的实例,因此这些对象不能被修改,这提供了很重要的性能优势
false 读写缓存,会返回缓存对象的拷贝(通过序列化),这会慢一些,但是安全,因此默认是false
MyBatis 使用第三方缓存 EHCache
MyBatis 作为ORM框架,在缓存方面做的可能不是太好,但是它预留了接口供给第三方进行调用,因此,我们在是使用缓存时可以采用第三方的缓存框架,例如 EHCache ,但是只能代理二级缓存,不能代理一级缓存。接下来使用 EHCache 第三方缓存工具进行演示。
1. 导入jar包
org.mybatis.caches mybatis-ehcache 1.2.2
2. 编写EHCache配置文件,注意文件名必须是 ehcache.xml,具体内容如下
EHCache配置文件说明:
| 属性名 | 是否必须 | 作用 |
|---|---|---|
| maxElementsInMemory | 是 | 在内存中缓存的element的最大数目 |
| maxElementsOnDisk | 是 | 在磁盘上缓存的element的最大数目,若是0则表示无穷大 |
| eternal | 是 | 设定缓存的element是否永不过期,为true则永不过期,为false则需要根据 timeToIdleSeconds、timeToLiveSecond判断 |
| overflowToDisk | 是 | 设定当内存溢出时是否将过期的element缓存到磁盘上 |
| timeToIdleSeconds | 否 | 当缓存在EHCache中的数据前后两次访问的时间超过该属性取值时,这些数据就会被删除,默认值0表示闲置时间无穷大 |
| timeToLiveSeconds | 否 | 缓存element的有效生命周期,默认是0表示存活时间无穷大 |
| diskSpoolBufferSizeMB | 否 | 磁盘缓存的缓存区大小,默认30MB,每个cache都应该有自己的缓冲区 |
| diskPersistent | 否 | 在VM重启时是否启用磁盘保存EHCache中的数据,默认false |
| diskExpiryThreadIntervalSeconds | 否 | 磁盘缓存的清理线程运行间隔,默认120秒 |
| memoryStoreEvictionPolicy | 否 | 移除策略,默认LRU(最近最少使用)、可选LFU(最不常用的)、FIFO(先进先出) |
3. 在mapper映射文件中开启二级缓存,并设置二级缓存的类型
4. 配置slf4j日志,这一步可选,主要是因为EHCache使用的是slf4j日志实现,创建名为 logback.xml 的配置文件
[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n
5. 测试,执行上面的二级缓存测试代码,可以看到sql只执行了一次,并且在缓存磁盘保存的路径中也会有缓存文件
源码地址:https://gitee.com/peachtec/hxz-study



