Mybatis执行器BatchExecutor、ReuseExecutor、SimpleExecutor介绍

news2024/11/19 23:20:13

一、关系

这里说下Executor接口和他的子类之间的关系

//最顶层的接口
public interface Executor {}
//接着是基础BaseExecutor
public abstract class BaseExecutor implements Executor {}

BaseExecutor有三个实现类BatchExecutor、ReuseExecutor、SimpleExecutor是并列关系。

public class BatchExecutor extends BaseExecutor {}//批量执行器BatchExecutor
public class ReuseExecutor extends BaseExecutor {}//复用执行器ReuseExecutor
public class SimpleExecutor extends BaseExecutor {}//简单执行器SimpleExecutor

2、CachingExecutor

CachingExecutor是对执行器和缓存的一个封装

public class CachingExecutor implements Executor {
	//Executor的实现类对象,可以是BatchExecutor、ReuseExecutor、SimpleExecutor
    private final Executor delegate;
    private final TransactionalCacheManager tcm = new TransactionalCacheManager();//二级缓存
	
    public CachingExecutor(Executor delegate) {//入参是Executor的实现类对象
        this.delegate = delegate;
    }
}

下面贴一段mybatis创建执行器的源码,更好的说明CachingExecutor

public Executor newExecutor(Transaction transaction, ExecutorType executorType) {

    Executor executor;
    if (ExecutorType.BATCH == executorType) {
        executor = new BatchExecutor(this, transaction);//批量执行器
    } else if (ExecutorType.REUSE == executorType) {
        executor = new ReuseExecutor(this, transaction);//复用执行器
    } else {
        executor = new SimpleExecutor(this, transaction);//默认简单执行器
    }

    //是否开启二级缓存
    if (cacheEnabled) {
    	//封装成带有二级缓存功能的执行器,在实现调用的过程中,如果开启了二级缓存,会先从缓存中获取数据,如果没有在调用具体执行器实现类,CachingExecutor也是Executor的实现类。这是什么设计模式?
        executor = new CachingExecutor(executor);
    }
    //将执行器添加到拦截器链中,在整个调用的过程中使用责任链的方式调用
    executor = (Executor) interceptorChain.pluginAll(executor);
    
    return executor;
}

二、执行流程

下面以查询为例,介绍下在开启了二级缓存时,执行器的执行流程,

1、CachingExecutor的query

@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
    //此时executor是CachingExecutor类型
    return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
    .....
}

@Override
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
    ...
    CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);//基于参数生成CacheKey
    return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}

@Override
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) {
    Cache cache = ms.getCache();
    if (cache != null) {
        //1、这里是处理二级缓存逻辑
        List<E> list = (List<E>) tcm.getObject(cache, key);
        if (list == null) {
            list = delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
            tcm.putObject(cache, key, list); // issue #578 and #116
        }
        return list;
    }
    
    //2、当缓存不存在,走数据库查询,注意此时的query走的是BaseExecutor
    return delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}

2、BaseExecutor的query

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    //判断一级缓存是否有数据
    list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
    if (list == null) {
        //没有,走数据查询
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
    }
    return list;
}

private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    //注意此时的doQuery是被子类重写了,假设使用默认执行器SimpleExecutor,调用SimpleExecutor的doQuery
    list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
    localCache.putObject(key, list);//设置一级缓存内容
    return list;
}

3、SimpleExecutor的doQuery

@Override
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    return handler.<E>query(stmt, resultHandler);//走数据库查询
}

总结:一开始进到CachingExecutor的query方法,在调用BaseExecutor的query方法,在进到SimpleExecutor的doQuery方法查询数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android攻城狮学鸿蒙-Tab

Entry Component struct TabPage {State message: string Hello World;private controler: TabsController new TabsController();build() {Column() {Tabs({ barPosition: BarPosition.Start, controller: this.controler }) {TabContent() {Column() {Text(哈哈哈哈).fontS…

怎么通过SaleSmartly优化Telegram营销

社交媒体的发展趋势一直是出海企业的“风向标”。截止至2023年6月&#xff0c;Telegram已成为除了WhatsApp之外全球苹果应用商店中用户下载量最多的社交网络应用&#xff0c;这个新兴的社媒平台正在逐渐扩大它的影响力。Telegram的崛起也意味着出现了新的商机&#xff0c;要怎么…

vue3实现在element Dialog 对话框中预览pdf文件

最近有一个需求就是点击按钮在弹框中去预览pdf文件&#xff0c;于是发现了一个HTML中比较重要的标签&#xff1a;embed&#xff0c;前面说的需求就可以用这个标签来实现&#xff0c;一起来学习一下吧。 embed标签是HTML中的一个非常重要的标签&#xff0c;它可以在你的网页上插…

CPU乱序执行

一、为什么CPU要乱序执行&#xff1f; 首先我们要明白一点&#xff0c;不是cpu真的乱序执行&#xff0c;而是为了提交执行效率&#xff0c;但这个所谓的乱序执行的前提下是有依据的&#xff0c;在没有互相依赖的代码行里才有可能产生这种乱序执行的现象。 1、有可能产生乱序执…

员工考勤统计表怎么做?

员工考勤统计表怎么做&#xff1f; 总结了下题主的需求—— 简单的考勤统计基础报表生成能自动打通对接钉钉考勤数据 这些需求其实都是最基本的考勤管理需求&#xff0c;最难的在于&#xff0c;如何能将钉钉考勤数据自动同步过来&#xff0c;如果能做到这点至少能提升60%的工…

ssm+vue基本微信小程序的今日菜谱系统

项目介绍 谈到外出就餐&#xff0c;我们除了怕排队&#xff0c;也怕这家餐厅的服务员不够用&#xff0c;没人为我们点餐&#xff0c;那么一餐饭排队一小时&#xff0c;点餐恐怕也要花个半小时&#xff0c;这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面…

2023年中国彩色滤光片竞争格局、市场规模及行业技术趋势分析[图]

彩色滤光片指实现液晶彩色显示的重要组件&#xff0c;该膜片可使经液晶控制的光线被过滤为红、蓝、绿三种基本色素点阵&#xff0c;并最终实现彩色显示画面的显示&#xff0c;彩色滤光片与LCD面板为一对一对应关系&#xff0c;即大尺寸彩色滤光片用于生产大尺寸LCD面板&#xf…

面试算法29:排序的循环链表

问题 在一个循环链表中节点的值递增排序&#xff0c;请设计一个算法在该循环链表中插入节点&#xff0c;并保证插入节点之后的循环链表仍然是排序的。 分析 首先分析在排序的循环链表中插入节点的规律。当在图4.15&#xff08;a&#xff09;的链表中插入值为4的节点时&…

倒计时 2 天!聚焦 Arm 性能提升,助力龙蜥生态落地应用

「龙蜥社区“走进系列”MeetUp」是由龙蜥社区与生态合作伙伴联合主办的系列月度活动&#xff0c;每期走进一家企业&#xff0c;聚焦龙蜥社区和合作伙伴的技术、产品和创新动态&#xff0c;展示硬核技术&#xff0c;共建繁荣生态。 本次龙蜥社区走进Arm MeetUp 将于 10 月 20 日…

大模型相关基础(基于李沐)

InstructGPT 介绍 ChatGPT用到的技术和InstructGPT一样的技术&#xff0c;区别是InstructGPT是在GPT3上微调&#xff0c;ChatGPT是在GPT3.5上微调。 InstructGPT论文发表在2022年3月4号&#xff0c;标题是《训练语言模型使得它们能够服从人类的一些指示》。 标题解释&#…

8+NAM+分型+单细胞生信思路

今天给同学们分享一篇肿瘤NAM分型单细胞的生信文章“Comprehensive analysis of nicotinamide metabolism-related signature for predicting prognosis and immunotherapy response in breast cancer”&#xff0c;这篇文章于2023年3月8日发表在Front Immunol期刊上&#xff0…

2023年中国现制咖啡市场发展概述分析:交易笔数和客单价将持续上升[图]

受到疫情封控影响&#xff0c;咖啡线下门店受到影响&#xff0c;但线上外卖门店仍保持良好发展态势&#xff0c;整体零售规模增长稳中有升。2022年&#xff0c;中国现制咖啡总零售规模为640亿元&#xff0c;2017-2022年零售规模的年复合增长率为16.3%。受益于资本关注、茶饮品牌…

安徽怀宁领导一行莅临蓝海彤翔集团参观考察

10月17日上午&#xff0c;中共怀宁县委书记余学峰&#xff0c;怀宁县政府副县长谭宪锋、怀宁县委办主任刘劲松、怀宁县招商中心副主任余飞、怀宁县委办四级主任科员彭俊等领导一行莅临蓝海彤翔集团参观考察&#xff0c;集团总裁鲁永泉、集团CTO穆凯辉接待了考察团一行。 考察团…

UE4 AI群集实现

逻辑就不用说了&#xff0c;就是计算对应图形位置让每个Pawn移动到该位置 因为有时候AI与AI会卡住 所以加上这个Bool为true&#xff0c;以及设置两个AI之间至少隔的距离&#xff0c;设置在一个合理的参数即可 有时候AI群集&#xff0c;AI与AI会比较紧密&#xff0c;可以将Caps…

【完美世界】两男神一美女登场,石昊杀真神夺金果,战帝老天人出世,云曦参战

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 完美世界动画终于更新第134集预告了&#xff0c;虽然不是云曦特别篇的内容&#xff0c;但是画质与特效明显提升了&#xff0c;打斗也开始燃起来了。而且还登场三位新角色&#xff0c;两大男神&#xff0c;一位…

c语言练习90:反转链表

反转链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 与方法一相比方法二的思路更容易实现 报错原因&#xff1a;head和n3不能为空&#xff0c;为空则不能执行后面的操作 报错原因&#xff1a;listnode*n1,n2,n3; 纠正&#xff1a;listnode *n1…

杨帆 2022年 毕业论文相关 基于WS-DAN与时空注意力的学生课堂行为检测研究

杨帆&#xff1a; 毕业论文相关 下面是我公开的毕业论文全部相关文件&#xff1a; https://share.weiyun.com/UhFV67ds https://share.weiyun.com/9qOxwpqz 下面是我曾经公开在b站上的视频&#xff0c;因为我导师不建议公开&#xff0c;今年9月删除了&#xff0c;下面是视频源…

私域流量经营怎么做?私域流量转化功能推荐

流量在商业中扮演着至关重要的角色。无论是在线下还是线上&#xff0c;谁能更快地获取和利用流量&#xff0c;谁就能在激烈的市场竞争中占据优势。然而&#xff0c;流量的转化方式在传统和数字化营销系统中有着显著的差异。 数字化营销系统&#xff0c;如分销系统、拼团系统、分…

《机器学习----简单的分类器》第二章、朴素贝叶斯,项目:使用特征值给语句打标签

贝叶斯分类器 1,朴素贝叶斯算法1. 朴素贝叶斯算法、2. 算法思路3. 贝叶斯定理4.特征的选用的要求和处理 2&#xff0c;算法应用1 文本分类2 垃圾邮件过滤3 情感分析 3. 朴素贝叶斯的优缺点1. 优点2. 缺点 项目实践1&#xff0c;算法流程2&#xff0c;具体实现 1,朴素贝叶斯算法…

第二证券:什么股票属于创业板?

股票商场是一种杂乱的国际&#xff0c;不同类型的股票对应不同的生意商场。其间&#xff0c;创业板股票是一个备受关注的论题。那么&#xff0c;什么样的股票归于创业板呢&#xff1f;本文将从商场定义、股票分类以及出资关键点三个角度分析这个问题&#xff0c;帮忙读者全面了…