mybatis 02 执行器源码分析

执行器架构图

SimpleExecutor

SimpleExecutor是默认执行器

会话中发生多次SQL,它都会通过对应的StatementHandler 构建一个新Statement

(即使相同SQL语句也无法重用Statement,这是不高效的机制)

ReuseExecutor

可重用执行器,这里的重用指的是数据库的Statement

ReuseExecutor 区别在于他会将在会话期间内的Statement进行缓存

成员变量statementMap,使用SQL语句作为Key

多次SQL时,若SQL一致,则不再重复构建,从缓存中取出即可

缓存机制

那么Statement缓存是什么个机制呢?

这个机制很简单:

  • sql相同即为命中Statement缓存!

  • 未命中的,生成Statement后放置到缓存中~

那么,Statement缓存的生命周期是怎么样的呢?

架构图

验证环节

相同的执行语句,会被缓存起来

BatchExecutor

BatchExecutor是批量执行器

BatchExecutor会根据外部的调用情况生成多组Statement,最终一起提交给数据库

那么,什么情况下会被视为同一个Statement呢,需同时满足三个条件:

• sql相同

• MappedStatement相同

• 代码调用上必须是连续的

关键代码

doUpdate

更新(增删改)时,连续两次是一样sql的,那么组合成一个Statement

为什么这样处理呢,用下面的例子很好理解:

若是两个setName拼合一起的话,addUser在后,setName在前,这时第2个setName肯定会报错!

doQuery

查询前会先flush,应该是要防止

flushStatements

这个方法不是BatchExecutor的成员方法,它来自父类BaseExecutor

作为批处理任务的最后一步,需要开发者手动调用,一次性将所有请求发送至数据库

小知识点

Collections.emptyList(),与new ArrayList想比,减少内存开销

机制示意图

验证环节

左边是两组不一样的Sql,在代码执行上因为相同两组sql不是连续的,所以右边被分割成了四组

BaseExecutor

基础执行器,主要是用于维护缓存和事物(通过会话中调用commit、rollback进行管理)。

关键内容

重点在于它对一级缓存的管理:

​localCache是BaseExecutor的成员变量:


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:mybatis 02 执行器源码分析

字数:545

本文作者:夏来风

发布时间:2020-05-31, 09:47:31

原始链接:http://www.demo1024.com/blog/mybatis-02-executor/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。