首页 > 其他分享 >MyBatis的执行器

MyBatis的执行器

时间:2022-10-07 22:56:35浏览次数:55  
标签:执行器 缓存 相同 Mybatis 二级缓存 线程 MyBatis

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[最近最少使用])
  • 数据过期清理
  • 保证线程安全
  • 缓存的命中率统计
  • 序列化

二级缓存命中条件

  1. 必须提交后(手动提交才能生效)
  2. Sql语句、参数相同
  3. statementId 相同
  4. 分页条件相同

为什么提交之后才能命中缓存?

主要是因为,二级缓存是跨线程访问的,为了防止其他线程的脏读。

 

标签:执行器,缓存,相同,Mybatis,二级缓存,线程,MyBatis
From: https://www.cnblogs.com/Joshua-BlueSky/p/16767415.html

相关文章