备注:
以下是一二级缓存建议关闭的配置:
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.fp.chargeoperation.domain
configuration:
map-underscore-to-camel-case: true
cacheEnabled: false
localCacheScope: STATEMENT
一.一级缓存
1.使用及配置
A:当带有相同的执行SQL在同一个会话session里面执行时,不再查询DB,而是直接查询缓存
Yml文件追加:
mybatis-plus:
configuration:
localCacheScope: SESSION
建议关闭设置:localCacheScope: STATEMENT
2.一级缓存(会话级别)的命中条件
mybatis-plus默认是开启状态
A. 相同的SQL语句和参数
B.会话级别缓存,必须是相同的会话
在CachingExecutor源码里面的CacheKey包含了会话ID,如果不是同一个会话则不会被命中
C.必须是调用相同的mapper方法
D.必须是相同的命名空间(namespace:mapper)
因为在mybatis的CachingExecutor源码里面CacheKey( 缓存的key) 包含了命名空间+方法ID+ sql组合而成
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
BoundSql boundSql = ms.getBoundSql(parameterObject);
CacheKey key = this.createCacheKey(ms, parameterObject, rowBounds, boundSql);
return this.query(ms, parameterObject, rowBounds, resultHandler, key,boundSql);
}
E.会话执行期间不能执行update,del,insert 写操作
只要执行了写操作,当前进程的全部会话缓存都会被清空。
F.在会话期间SQL执行中不能追加flush操作
二. 一级缓存的处理流程
A:客户端调用,Cache
B:动态代理,MapperMethod -aMappperProxyaProxy
C:会话调用,DefaultSqlSession
D:拼装缓存key,CachingExecutor
E:判断是否存在二级缓存:CachingExecutor
F:执行一级缓存(是否清空,判断缓存)BaseExecutor
G: 获取一级缓存数据:PerpetualCache
三.二级缓存的使用背景
1. 字典表静态数据
这样的数据很稳定,虽然可以放到一级缓存中,但如果client发起多次会话请求时仍然会查询数据库。
即两个不同的会话虽然查询SQL都是一样的,但不能够命中缓存,因为会话不同。
Query的请求顺序是先二级缓存—>一级缓存-->数据库
mybatis-plus 的二级缓存默认开启的,需要手动关闭。但即便不关闭没有配置xml的cache你的查询也不会命中
二级缓存是在不同会话之间使用的,与一级缓存的相同会话互补。
2.使用方法
A:Yml文件配置:
mybatis-plus:
configuration:
cacheEnabled: true
B:在需要使用缓存查询的mapper文件中追加缓存引用的配置
<cache eviction="FIFO" flushInterval="10800000" size="1024" readOnly="true" />
Eviction:回收策略(FIFO,LRU ,SOFT )
flushInterval:刷新间隔
readOnly:
size:可用内存资源数目
readOnly:只读的缓存会给所有调用者返回缓存对象的相同实例, 可读写的缓存会返回缓存对象的拷贝 ,默认是false。
3.二级缓存的使用条件
A. 不同的会话,且只有当上一会话的session提交或者关闭之后才会生效。
意思是指前一个会话在提交或关闭之后才会把信息写入缓存,如果在前一个会话关闭之前另一个会话来查询则不会命中缓存。
B.必须是调用相同的mapper方法
C.必须是相同的命名空间(namespace:mapper)
D.会话执行期间不能执行update,del,insert 写操作
E.在SQL执行中不能追加flush标签
备注:
一级缓存即便开启,在进程中的命中概率也很低
二级缓存除了配置开启开关还需修改xml文件