自定义Mybatis LanguageDriver性能优化

场景:高并发情况下mybatis 动态sql 解析 锁问题优化

  • 优化前 并发测试 XMLLanguageDriver 类 的 createSqlSource 方法有锁 而且 每次执行时都会走该方法
    在这里插入图片描述

  • 在这里插入图片描述

  • 优化前 : 线程有Block
    在这里插入图片描述

  • 优化后的 LanguageDriver

public class CustomXMLLanguageDriver implements LanguageDriver {


    private final Map<String, SqlSource> sqlSourceCache = new ConcurrentHashMap<>();

    @Override
    public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
        return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
    }

    @Override
    public SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType) {
        XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);
        return builder.parseScriptNode();

    }


    @Override
    public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {
        if (script.startsWith("<script>")) {
            SqlSource cachedSqlSource = sqlSourceCache.get(script);
            if (cachedSqlSource != null) {
                return cachedSqlSource;
            }
            XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver());
            SqlSource sqlSource = this.createSqlSource(configuration, parser.evalNode("/script"), parameterType);
            sqlSourceCache.put(script, sqlSource);
            return  sqlSource;
        } else {
            script = PropertyParser.parse(script, configuration.getVariables());
            TextSqlNode textSqlNode = new TextSqlNode(script);
            return (SqlSource) (textSqlNode.isDynamic() ? new DynamicSqlSource(configuration, textSqlNode) : new RawSqlSource(configuration, script, parameterType));
        }
    }
}


优化后使用相同的压测条件 发现线程没有Block 的 而且调用栈 中只有Druid 的 初始化线程池 有Block XMLLanguageDriver Block 消失

在这里插入图片描述

  • 此时的 线程没有阻塞
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CANoe】CANoe使用XCP读取观测量

文章目录 1、硬件连接&#xff1a;配置CANoe的CAN端口&#xff0c;连接到ECU标定对应的CAN口2、检查是否支持AMD/XCP3、加载a2l文件并配置相关信息4、选择需要的标定量和观测量5、在CANoe中系统变量中可查看刚才添加的量6、添加标定量和观测量到Data Window中7、开启CANoe工程&…

深度学习|词嵌入的演变

文本嵌入&#xff0c;也称为词嵌入&#xff0c;是文本数据的高维、密集向量表示&#xff0c;可以测量不同文本之间的语义和句法相似性。它们通常是通过在大量文本数据上训练 Word2Vec、GloVe 或 BERT 等机器学习模型来创建的。这些模型能够捕获单词和短语之间的复杂关系&#x…

【Python】计算最少排班人数(2)

接前一文章 部分关键代码及方法&#xff1a; 程序界面代码&#xff1a; winTk() win.config(bg#F2F2D7) win.geometry(550x440) win.title(最优排班计算器)frameFrame(win,width500,height60,bg#F2F2D7) frame.grid(row0,column0,columnspan5) l1Label(frame,text选择文件&a…

数字工厂管理系统建设层级分为哪几层

随着工业4.0时代的到来&#xff0c;数字工厂已成为制造业转型升级的必经之路。数字工厂管理系统作为数字工厂的核心组成部分&#xff0c;对于提高生产效率、降低成本、提升质量等方面具有重要意义。数字工厂管理系统的建设层级一般分为以下几个层次&#xff0c;本文将对其进行详…

vue 实现签字功能

1、安装&#xff1a;npm install vue-esign --save 2、main.js文件中全局引入&#xff1a; // 签字 import vueEsign from vue-esign Vue.use(vueEsign) 3、页面内容 <vue-esign ref"esign" :width"800" :height"300" :isCrop"isCro…

自由贸易协定与跨境电商:全球贸易新时代的开启

自由贸易协定&#xff08;Free Trade Agreements, FTA&#xff09;的崛起和跨境电商的兴起相辅相成&#xff0c;共同推动着全球贸易迈入新的时代。本文将深入探讨自由贸易协定与跨境电商的紧密关系&#xff0c;分析它们如何共同促成全球贸易的自由化和便利化&#xff0c;开启全…

KaiwuDB × 国网山东综能 | 分布式储能云边端一体化项目建设

项目背景 济南韩家峪村首个高光伏渗透率台区示范项目因其所处地理位置拥有丰富的光照资源&#xff0c;该区域住户 80% 以上的屋顶都安装了光伏板。仅 2022 年全年&#xff0c;光伏发电总量达到了百万千瓦时。 大量分布式光伏并网&#xff0c;在输出清洁电力的同时&#xff0c…

Android Studio中配置Flutter插件,创建小项目“hello world”

文章目录 一、下载Flutter SDK二、Android studio中安装Flutter插件三、创建Flutter小项目 一、下载Flutter SDK 打开官网https://flutter.io/setup-windows/下载Flutter sdk并解压到一目录 二、Android studio中安装Flutter插件 Android studio中安装Flutter插件&#x…

源代码泄密困扰企业?上海迅软DSE助力解决问题

源代码是软件开发最重要的资源&#xff0c;同时也是开发人员思想、经验和工作的结晶。对于软件开发企业来说&#xff0c;实施有效的源代码防泄密措施至关重要&#xff0c;因为源代码文档和程序文档都具有极高的商业价值&#xff0c;属于企业的商业机密。 为了确保企业的源代码…

Docker 安装Apache Superset 并实现汉化和快速入门

什么是Apache Superset Apache Superset是一个现代化的企业级商业智能Web应用程序。Apache Superset 支持用户的各种数据类型可视化和数据分析&#xff0c;支持简单图饼图到复杂的地理空间图表。Apache Superset 是一个轻量级、简单化、直观化、可配置的BI 框架。 Docker 安…

AI智能视界,视频监控技术的革新与突破

智能视频监控概述 TSINGSEE青犀智能监控系统是通过摄像头采集视频数据&#xff0c;经过压缩技术处理后传输至服务器&#xff0c;再由服务器进行存储和管理并汇聚到EasyCVR视频融合平台之中&#xff0c;进行统一的分发处理。采用先进的视频压缩技术&#xff0c;确保视频质量&am…

PyCharm安装教程

1.1 为什么要安装python开发环境 上一篇文章我们安装了python&#xff0c;准确来说是python解释器&#xff0c;它没有自带的可视化开发工具&#xff0c;只能通过命令行窗口来执行python代码&#xff0c;这里我们就来下载一个用于python开发的可视化工具——PyCharm。 1.2 PyC…

C语言 二叉树详解(自我理解版)!!!二叉树的实现

目录 1.树的概念和结构&#xff08;了解&#xff09; 1.1树的概念 1.2关于树的每个组成结构的叫法 1.3树的结构体表示 1.4树在实际中的运用 2.二叉树的概念和结构和实现&#xff08;本期偏重点之一&#xff09; 二叉树的概念 ​编辑 特殊的二叉树 1.完全二叉树 2.满二…

HarmonyOS4.0从零开始的开发教程11Video组件的使用

HarmonyOS&#xff08;九&#xff09;Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能…

react 学习笔记 李立超老师(学习中~) | JSX - React组件 - 钩子函数

文章目录 react学习笔记01入门概述React 基础案例HelloWorld三个API介绍 JSXJSX 解构数组 创建react项目(手动)创建React项目(自动) | create-react-app事件处理React中的CSS样式内联样式 | 内联样式中使用state (不建议使用)外部样式表 | CSS Module React组件函数式组件和类组…

郑重声明 | 【机器学习之心】无小号,打者本人旗号干活的其他号,本人概不负责,可笑,未经过我同意就成你们的合作账号了?

打着本人旗号的号如下&#xff08;主要是天天Matlab团队&#xff09; 可笑&#xff0c;未经过我同意就成你们的合作账号了&#xff1f; 天天Matlab科研工作室 科研助手大师 机器学习之星主&#xff08;这个恶心&#xff0c;名字都仿我&#xff09; 海神之光 上述号没有程序售…

亚马逊鲲鹏系统:防关联技术守护您的账户安全

亚马逊买家账号注册是一项相当简便的操作&#xff0c;但当涉及到批量注册时&#xff0c;我们就需要更加注意防关联的问题。对于那些对此领域不够熟悉的朋友们&#xff0c;可以使用亚马逊鲲鹏系统&#xff0c;这款系统能够为我们提供一站式的解决方案。该系统不仅支持买家账号的…

Windows提权方法

简介 内网提权&#xff0c;本意为通过某些服务的漏洞&#xff0c;从而获取到该服务器的shell&#xff0c;进而内网渗透&#xff0c;最终从普通用户变成超级管理员的一个过程 以下是一些常见的内网提权原理和方法&#xff1a; 横向移动&#xff1a;攻击者通过在内网中的一台受感…

(五)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启

目录 1. 中断相关知识简介 1.1 什么是中断 1.2 什么是内中断、外中断 1.3 什么是可屏蔽中断、不可屏蔽中断 2. CM3 内核中断介绍 2.1 F103系统异常清单 2.2 F103 外部中断清单 3. NVIC 简介 3.1 NVIC 寄存器简介 3.2 NVIC 相关寄存器的介绍 4. 中断优先级 4.1 优先…

同义词替换器降低论文重复率的最新技术进展

大家好&#xff0c;今天来聊聊同义词替换器降低论文重复率的最新技术进展&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;同义词替换器降低论文重复率的最新技术进展 一、引言 随着学术…