牛叉了-arthas 热更新 mybatis mapper xml

2024-08-21 00:08

本文主要是介绍牛叉了-arthas 热更新 mybatis mapper xml,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试环境能够热更新class 能否热更新mapper xml? arthas 群有同学提了这样的一个需求,必须满足满足
arthas-idea-plugin 2.8 版本 https://plugins.jetbrains.com/plugin/13581-arthas-idea

1、基本思路

1.1 流程图

在这里插入图片描述

1.2 实现效果

 echo `redis-cli -h '127.0.0.1' -p 6379  get arthasIdeaPluginRedefineCacheKey_e00b5a9e-d926-43c6-8b3f-5790841557ed`  | base64 --decode >arthas-idea-plugin-mybatis-mapper-xml-reload.sh;chmod a+x arthas-idea-plugin-mybatis-mapper-xml-reload.sh;./arthas-idea-plugin-mybatis-mapper-xml-reload.sh;
./arthas-idea-plugin-mybatis-mapper-xml-reload.sh: line 13: /Users/wangji/opt/arthas/mybatis/mapper/UserDoMapper.xml: Permission denied
************************************************************************************************************************
* arthas idea plugin begin;start script path: /Users/wangji/opt/arthas/arthas-idea-plugin-mybatis-mapper-xml-reload.sh *
************************************************************************************************************************decode base64 text to path /Users/wangji/opt/arthas/mybatis/mapper/UserDoMapper.xml[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
* [1]: 98083 org.jetbrains.idea.maven.server.RemoteMavenServer36[2]: 98051 org.jetbrains.jps.cmdline.Launcher[3]: 98052 com.intellij.idea.Main[4]: 98167 org.jetbrains.idea.maven.server.RemoteMavenServer36[5]: 98567 org.jetbrains.jps.cmdline.Launcher[6]: 98568 com.boot.mybatis.mybatisdemo.MybatisDemoApplication[7]: 96571 org.jetbrains.kotlin.daemon.KotlinCompileDaemon[8]: 98076 org.jetbrains.jps.cmdline.Launcher[9]: 96412请手动选择进程或者idea 预先配置jps -l 工程名称自动执行6
******************************************************************
* first: get spring static spring context class1oader hash value *
******************************************************************arthas start command :/Users/wangji/opt/arthas/as.sh --height 100 --width 200 --select 98568  -c "sc -d com.boot.mybatis.mybatisdemo.common.ApplicationContextProvider"  | tee /Users/wangji/opt/arthas/classLoaderHashValue.out
Arthas script version: 3.5.0
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
[INFO] Process 98568 already using port 3658
[INFO] Process 98568 already using port 8563
Arthas home: /Users/wangji/opt/arthas
Calculating attach execution time...
Attaching to 98568 using version /Users/wangji/opt/arthas...real	0m0.236s
user	0m0.419s
sys	0m0.056s
Attach success.,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---./  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.5.0
main_class com.boot.mybatis.mybatisdemo.MybatisDemoApplication
pid        98568
time       2021-05-10 22:00:59[arthas@98568]$ sc -d com.boot.mybatis.mybatisdemo.common.ApplicationContextProvider | plaintextclass-info        com.boot.mybatis.mybatisdemo.common.ApplicationContextProvidercode-source       /Users/wangji/Documents/project/mybatis-demo/target/classes/name              com.boot.mybatis.mybatisdemo.common.ApplicationContextProviderisInterface       falseisAnnotation      falseisEnum            falseisAnonymousClass  falseisArray           falseisLocalClass      falseisMemberClass     falseisPrimitive       falseisSynthetic       falsesimple-name       ApplicationContextProvidermodifier          publicannotation        org.springframework.stereotype.Componentinterfaces        org.springframework.context.ApplicationContextAwaresuper-class       +-java.lang.Objectclass-loader      +-sun.misc.Launcher$AppClassLoader@18b4aac2+-sun.misc.Launcher$ExtClassLoader@5762806eclassLoaderHash   18b4aac2Affect(row-cnt:1) cost in 22 ms.
[arthas@98568]$**************************************************************
* last: invoke spring bean to reload mybatis mapper xml file *
**************************************************************arthas start command :/Users/wangji/opt/arthas/as.sh --height 100 --width 200 --select 98568  -c "ognl -x 3 '#springContext=@com.boot.mybatis.mybatisdemo.common.ApplicationContextProvider@context,#springContext.getBean("mybatisMapperXmlFileReloadService").reloadAllSqlSessionFactoryMapper("/Users/wangji/opt/arthas/mybatis/mapper/UserDoMapper.xml")' -c 18b4aac2"  | tee /Users/wangji/opt/arthas/mybatisMapperXmlReloadResult.out
Arthas script version: 3.5.0
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
[INFO] Process 98568 already using port 3658
[INFO] Process 98568 already using port 8563
Arthas home: /Users/wangji/opt/arthas
Calculating attach execution time...
Attaching to 98568 using version /Users/wangji/opt/arthas...real	0m0.212s
user	0m0.383s
sys	0m0.051s
Attach success.,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---./  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.5.0
main_class com.boot.mybatis.mybatisdemo.MybatisDemoApplication
pid        98568
time       2021-05-10 22:00:59Mapper("/Users/wangji/opt/arthas/mybatis/mapper/UserDoMapper.xml")' -c 18b4aac2 | plaintextontextProvider@context,#springContext.getBean("mybatisMapperXmlFileReloadService").reloadAllSqlSessionFactory
@Boolean[true]
[arthas@98568]$
********************************************************
* arthas idea plugin mybatis mapper xml reload success *
********************************************************

2、解决的问题

  • 基于static spring context 调用bean 方法传递 路径,提供一个 spring bean 去执行热更新
  • 需要全局的自动化,解决classloader的传递问题,需要脚本去解决。

基于这样的一个思路,提供一个bean 一个路径即可
com.github.wangji92.mybatis.reload.core.MybatisMapperXmlFileReloadService#reloadAllSqlSessionFactoryMapper

详细代码地址可以参考:https://github.com/WangJi92/mybatis-mapper-reload-spring-boot-start
简单的实现有bug 欢迎提交pr

public boolean reloadAllSqlSessionFactoryMapper(String mapperFilePath) {if (CollectionUtils.isEmpty(sqlSessionFactoryList)) {log.warn("not find SqlSessionFactory bean");return false;}Path path = Paths.get(mapperFilePath);if (!Files.exists(path)) {log.warn("mybatis reload mapper xml not exist ={}", mapperFilePath);return false;}AtomicBoolean result = new AtomicBoolean(true);sqlSessionFactoryList.parallelStream().forEach(sqlSessionFactory -> {Configuration configuration = sqlSessionFactory.getConfiguration();if (!this.removeMapperCacheAndReloadNewMapperFile(path, configuration)) {log.warn("reload new mapper file fail path={}", path.toString());result.set(false);} else {log.info("reload new mapper file success path={}", path.toString());}});return result.get();}

3、配置

3.1 配置static spring context

https://www.yuque.com/wangji-yunque/ikhsmq/ugrc8n#4XuEK 详情查看这里。
在这里插入图片描述

3.2 配置 reload mapper service bean name method name

在这里插入图片描述

4、测试

demo link: https://github.com/WangJi92/mybatis-log-demo

4.1 old

<select id="selectByExample" parameterType="com.boot.mybatis.mybatisdemo.model.dataobject.UserDoExample" resultMap="BaseResultMap">select<if test="distinct">distinct</if><include refid="Base_Column_List" />from user<if test="_parameter != null"><include refid="Example_Where_Clause" /></if><if test="orderByClause != null">order by ${orderByClause}</if></select>

在这里插入图片描述

4.2 选择修改的xml 文件

4.2.1 构建脚本

在这里插入图片描述

4.2.2 修改的xml
<select id="selectByExample" parameterType="com.boot.mybatis.mybatisdemo.model.dataobject.UserDoExample" resultMap="BaseResultMap">selectnamefrom user<if test="_parameter != null"><include refid="Example_Where_Clause" /></if><if test="orderByClause != null">order by ${orderByClause}</if></select>
4.2.3 执行后的结果

在这里插入图片描述

在这里插入图片描述

这篇关于牛叉了-arthas 热更新 mybatis mapper xml的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091570

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis