牛叉了-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的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

intellij idea generatorConfig.xml

generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-ge

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent