Mybatis执行器种类
Mybatis的执行器Executor分为三类
- 简单执行器:SimpleExcutor
- 可重用执行器:ReuseExcutor
- 批量执行器:BatchExcutor
配置:在Mybatis配置文件中配置执行器
原理
初始化sqlSession会读取配置文件,若配置了执行器则使用对应的执行器,未配置则使用SimpleExecutor
- SimpleExecutor简单执行器,会进行两次预编译,每次都会构造一个PreparmentStatement对象------效率较低
- 可重用执行器ReuseExcutor,执行相同的sql语句只会进行一次预编译,效率更高
- 批量执行器BatchExcutor,查询时与SimpleExecutor相同会进行多次编译,更新或删除时,会批量进行,需要手动提交
BaseExecutor与CachingExecutor分别实现了Mybatis的一级缓存和二级缓存
BaseExecutor
BaseExecutor中的query方法中实现了逻辑缓存,当缓存中没有数据时则调用实现类中的doQuery查询数据库,并创建一级缓存key-------一级缓存是默认开启的并且在同一个线程中有效,同时查询完毕之后,立即建立缓存
Mybatis一级缓存:存放hashMap中,线程安全(sqlSession线程也不安全)
命中相关
- 同一会话中(会话级缓存)
- sql语句、参数相同
- 相同的statementId
- RowBounds相同(mybatis分页使用,为参数相同)
操作与配置
- 未手动清空缓存
- 未配置 @Options
- 未执行 Update 语句
- 使用事务提交、回滚操作
一级缓存失效场景
由于spring的封装,导致每次查询都会创建一个SqlSession,因为一级缓存是会话级缓存,所以导致失效
解决:在同一个事务下不会重新创建sqlSession,开启事务即可
==========================================================二级缓存
实现类:cachingExecutor 采用装饰着模式+责任链实现
当开启二级缓存时,先执行二级缓存,再执行一级缓存
二级缓存存在的意义
- 二级缓存跨线程
- 一级缓存的作用范围相对较小,二级缓存的生命周期为整个应用
需求
- 存储的多元性(Redis、Mysql、内存等)
- 存储容量需要限定,就存在淘汰规则(FIFO[先进先出]、LRU[最近最少使用])
- 数据过期清理
- 保证线程安全
- 缓存的命中率统计
- 序列化
二级缓存命中条件
- 必须提交后(手动提交才能生效)
- Sql语句、参数相同
- statementId 相同
- 分页条件相同
为什么提交之后才能命中缓存?
主要是因为,二级缓存是跨线程访问的,为了防止其他线程的脏读。
标签:执行器,缓存,相同,Mybatis,二级缓存,线程,MyBatis From: https://www.cnblogs.com/Joshua-BlueSky/p/16767415.html