缓存
mybatis的缓存分为一级缓存跟为二级缓存
一级缓存
一级缓存是sqlSession级别的缓存,就是sqlSession级别的一个map。一级缓存是一直开启的,也就是说每一个sqlSession对象都有自己的一级缓存,两个一级缓存之间不能共用
一级缓存又称本地缓存,与数据库同一次会话期间查询到的数据会放到本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去数据库
一级缓存失效的情况(没有使用到当前一级缓存的情况,效果就是还需要向数据库发出查询)
- sqlSession不同,一级缓存会失效
- sqlSession相同,查询条件不同(因为当前缓存中还没有这个数据)
- sqlSession相同,两次查询之间执行了增删改操作(因为这次增删改可能会对当前数据有影响)
- sqlSession相同,手动清除了一级缓存(缓存清空,没有数据) 使用session.clearCache();
二级缓存
又称全局缓存,基于namespace级别的缓存,一个xml文件的namespace对应一个二级缓存
工作机制:
- 一个会话,查询一条数据,这个数据就会被放到当前会话的一级缓存中
- 如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存
使用
- 开启全局二级缓存配置 <setting name=”cacheEnabled” value=”true” />
- 去mapper.xml文件中配置使用二级缓存 <cache eviction=”” flushInterval=”” readOnly=”” size=”” type=””></cache>
属性说明:
(1) eviction:缓存的回收策略
① LRU(默认) – 最近最少使用的:移除最长时间不被使用的对象。
② FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
③ SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
④ WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
(2) flushInterval:缓存刷新间隔,即缓存多长时间清空一次,默认不清空,可以设置一个毫秒值
(3) readOnly:缓存是否只读
① true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据,为了加快速度,mybatis会直接将数据在缓存中的引用交给用户。这样做不安全,但是速度快
② false(默认):非只读,mybatis会利用序列化&反序列化的技术克隆一份新的数据给用户,安全,但是速度慢
(4) size:缓存的大小
(5) type:自定义缓存时,指定自定义缓存的全类名,实现Cache即可自定义缓存
3. 我们定义的POJO需要实现序列化接口Serializable
缓存相关的设置以及属性
- cacheEnable=true, false:关闭缓存(二级缓存关闭)(一级缓存仍然可用)
- <select useCache=”true”></select>:每个select标签都有useCache属性,为false时关闭二级缓存,一级缓存仍然可用
- flushCache=”true”:每个增删改标签都有这个属性,默认是true,也就是增删改执行后就会清空缓存,一二级缓存都会被清空。查询标签中也有这个属性,但是默认是false
- sqlSession.clearCache():只清除当前session的一级缓存
- localCacheScope:本地缓存作用域(一级缓存)
- 缓存的使用顺序,先看二级缓存,再看一级缓存,如果都没有再去数据库

浙公网安备 33010602011771号