Mybatis插件,能做的事情真的很多
大家好,我是架构摆渡人。这是实践经验系列的第九篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。
Mybatis是我们经常用的一款操作数据库的框架,它的插件机制设计的非常好,能够在很多需求场景下派上用场。如果你还没用过Mybatis的插件(Mybatis 插件实际是一种拦截器),那么需要仔细阅读这篇文章。
SQL监控埋点
说句大实话,大部分性能问题都发生在存储层。当然对于优化我们需要有足够的样本,这些样本也就是慢SQL。数据库本身就有慢SQL的日志,但不方便我们跟具体的接口和trace进行关联。
如果要跟trace进行关联那么就必须自己进行埋点上报性能数据,像我们之前用Cat做监控的时候,就是基于Mybatis的插件进行埋点,这样可以在Cat中看到每次请求下执行了哪些SQL,以及SQL的执行时间。
SQL校验
如果你们的表做了水平拆分,也就是分库分表。当然有可能是用开源框架实现的,也有可能是自研的框架。对于SQL的写法没有过多要求,但是如果是分库分表,而你的查询语句中没有带分片的字段,这个时候一般都是会进行所有表的查询,然后合并结果返回。
假如你想打破这个规则,查询的SQL中必须带分片的字段,否则就直接报错。当然可以对你们的分库分表框架进行改造,如果是开源的改起来比较麻烦,那是否可以简单点实现呢?
可以的,答案就是用Mybatis插件进行扩展,拿到执行的SQL进行分析,然后做校验。
SQL改写
SQL改写相对来说用的比较少,主要是改写是个很危险的事情,稍有不慎,线上就要炸锅了。那么改写会有哪些场景下需要呢?
之前有遇到过的场景就是,我们接了一个新的分库分表的框架,老框架是支持分表场景下update分片字段的。比如你user表的分片字段是id,那么update语句中可以带上这个id,只不过值还是原来的,不影响数据,这种也经常会在用一些自动生成SQL的场景下会有。
自从接了新框架后,对SQL更新有要求啦,分片字段是不允许更新的,不能出现在update的SQL中,如果有就直接报错。所以这个时候改写SQL就排上用场了,当然为了稳定性,我们还是采用了最原始的方式,将所有SQL都改了一遍。
SQL中透传信息
SQL中透传信息这个很实用,问题在于透传的信息给谁使用呢?
其实这个要归根于你们有没有使用Proxy方式的分库分表中间件,如果有的话就需要透传信息。
比如读写分离场景,Proxy怎么知道你的SQL要走主库还是走从库呢?
比如在做压测的时候,Proxy怎么知道你的SQL要走正常库还是影子库呢?当然这个你也可以把影子库控制放在客户端。
那么如何通过SQL进行信息透传呢?如下:
/*master:true*/ SELECT * FROM table
其实就是在SQL的前面加一些特殊的信息,然后中间件去解析做对应的处理。
Mybatis插件,能做的事情真的很多的更多相关文章
- Mybatis插件机制以及PageHelper插件的原理
首先现在已经有很多Mybatis源码分析的文章,之所以重复造轮子,只是为了督促自己更好的理解源码. 1.先看一段PageHelper拦截器的配置,在mybatis的配置文件<configurat ...
- mybatis插件机制及分页插件原理
MyBatis 插件原理与自定义插件: MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式 ...
- 自己动手编写一个Mybatis插件:Mybatis脱敏插件
1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...
- Intelij IDEA 2016.3安装mybatis插件并激活教程
转载自:http://blog.csdn.net/solo_talk/article/details/53540449 现在Mybatis框架越来越受欢迎,Intelij IDEA这个编辑器逐渐成为很 ...
- MyBatis7:MyBatis插件及示例----打印每条SQL语句及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update.q ...
- MyBatis 插件 : 打印 SQL 及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...
- MyBatis插件及示例----打印每条SQL语句及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update.q ...
- 10件5G能实现,但4G不能做的事情
10件5G能实现,但4G不能做的事情 从三星Galaxy S10 5G手机到OnePlus 7 Pro 5G手机以及更高版本,首批5G手机现已上市.5G网络时代的开启是从小范围内,如果你居住在可以使用 ...
- MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)
在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...
随机推荐
- SpringBoot中Post请求提交富文本数据量过大参数无法获取的问题
yml增加配置 # 开发环境配置 server: tomcat: max-http-form-post-size: -1
- table中tr、td标签设置只读,不能修改(readonly属性)
在不能修改的位置加上代码:onselectstart="return false" οnselect="document.selection.empty()" ...
- JAVA获取当前日期指定天数之后的日期
/** * 获取day天之后的日期 * @param day 天数 * @return */ public static String getDate(int day){ Calendar calen ...
- Qt之使用qss设置Qwidget背景色无效解决
如题 解决方案 添加头文件 #include <QStyleOption> 重写函数paintEvent 内容如下 void statistics_assistant::paintEven ...
- 【LeetCode】1005. Maximize Sum Of Array After K Negations 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...
- 【LeetCode】748. Shortest Completing Word 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 1052 - String Growth
1052 - String Growth PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Z ...
- Pikachu漏洞练习-SQL-inject(持续更新)
本来在bup中repeater模式可以多次测试,但不知为何总是出错 这里把我们想查询的数据库和版本进行联合查询,放包,页面回显数据库名称和版本分别为pikachu,5.7.26 数据库版本大于5那么i ...
- MySQL数据库基础(1)数据库基础
目录 一.数据库简介 二.mysql数据库 三.客户端连接mysql服务 四.Navicat for mysql 一.数据库简介 1.概念 (1)数据:如文字.图形.图像.声音以及学生的档案记录等,这 ...
- x86-2-保护模式(protect mode)
x86-2-保护模式(protect mode) 引入保护模式的原因: 操作系统负责计算机上的所有软件和硬件的管理,它可以百分百操作计算机的所有内容.但是,操作系统上编写的用户程序却应当有所限制,比如 ...