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 ...
随机推荐
- jQuery实现页面导航内容定位效果,并支持内容切换
需求 页面向下滚动时,需要将顶部的搜索栏信息和导航菜单吸顶,并且,搜索栏信息和导航菜单之间可以切换. 效果 https://www.iguopin.com/index.php?m=&c=ind ...
- centos使用docker安装clickhouse
拉取镜像 docker pull yandex/clickhouse-server:20.3.12.112 启动 docker run -d --name=clickhouse-server -p 8 ...
- springboot整合阿里云视频点播接口
官方SDK文档地址: https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.904.4e0d3bd9VbkIC ...
- AQS的原理及源码分析
AQS是什么 AQS= volatile修饰的state变量(同步状态) +FIFO队列(CLH改善版的虚拟双向队列,用于阻塞等待唤醒机制) 队列里维护的Node节点主要包含:等待状态waitStat ...
- 【LeetCode】448. Find All Numbers Disappeared in an Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 方法一:暴力求解 方法二:原地变负做标记 方法三:使用set ...
- 【LeetCode】Swap Nodes in Pairs 解题报告
Swap Nodes in Pairs [LeetCode] https://leetcode.com/problems/swap-nodes-in-pairs/ Total Accepted: 95 ...
- 1122 机器人走方格 V4
1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB 四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子 ...
- 1632 B君的连通
B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后 ...
- 1269 - Consecutive Sum
1269 - Consecutive Sum PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB ...
- 第三十六个知识点:Index Calculus算法
第三十六个知识点:Index Calculus算法 我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法. 注意这里Index Calculus算法没有找到合适 ...