本文主要基于 MyCAT 1.6.5 正式版
1. 概述
2. 接收请求,解析 SQL
3. 获得路由结果
4. 获得 MySQL 连接,执行 SQL
5. 响应执行 SQL 结果
友情提示:欢迎关注公众号【芋道源码】。关注后,拉你进【源码圈】微信群和【芋艿】搞基嗨皮。
友情提示:欢迎关注公众号【芋道源码】。关注后,拉你进【源码圈】微信群和【芋艿】】搞基嗨皮。
友情提示:欢迎关注公众号【芋道源码】。关注后,拉你进【源码圈】微信群和【芋艿】】搞基嗨皮。
1. 概述
本文讲解 【单库单表】插入 所涉及到的代码。交互如下图:
单库单表插入简图
整个过程,MyCAT Server 流程如下:
接收 MySQL Client 请求,解析 SQL。
获得路由结果,进行路由。
获得 MySQL 连接,执行 SQL。
响应执行结果,发送结果给 MySQL Client。
我们逐个步骤分析,一起来看看源码。
2. 接收请求,解析 SQL【单库单表】插入(01主流程)【 1 - 2 】
接收一条MySQL 命令。在【1】之前,还有请求数据读取、拆成单条 MySQL SQL。
【 3 】
不同 MySQL 命令,分发到不同的方法执行。核心代码如下:
/// 等 SQL 归属于 ,详细可见:《MySQL协议分析#4.2 客户端命令请求报文(客户端 -> 服务器)》。
【 4 】
将 二进制数组 解析成 SQL。核心代码如下:
【 5 】
解析 SQL 类型。核心代码如下:
【 6 】
执行 SQL,详细解析见下文,核心代码如下:
3. 获得路由结果【单库单表】插入(02获取路由)【 1 - 2 】【 12 】
获得路由主流程。核心代码如下:
路由详细解析,我们另开文章,避免内容过多,影响大家对【插入】流程和逻辑的理解。
【 3 - 6 】
路由前置处理。当符合如下三种情况下,进行处理:
{ 1 } 使用全局序列号:
{ 2 } ER 子表插入
{ 3 } 主键使用自增 ID 插入:
情况 { 1 } { 3 } 情况类似,使用全局序列号。
核心代码如下:
处理 SQL 考虑性能,实现会比较 C-style,代码咱就不贴了,传送门:https://github.com/YunaiV/Mycat-Server/blob/1.6/src/main/java/io/mycat/route/util/RouterUtil.java。 (该仓库从官方 Fork,逐步完善中文注释,欢迎 Star)
【 7 - 11 】
当前置路由处理全局序列号时,添加到全局序列处理器()。该处理器会异步生成 ID,替换 SQL 内的 正则。例如:
异步处理完后,调用 方法重新执行 SQL。
核心代码如下:
此处有个疑问: 是单线程,会不会插入性能有一定的影响?后续咱做下性能测试。
4. 获得 MySQL 连接,执行 SQL【单库单表】插入(03执行 SQL)【 1 - 8 】
获得 MySQL 连接。
PhysicalDBNode :物理数据库节点。
PhysicalDatasource :物理数据库数据源。
【 9 - 13 】
发送 SQL 到 MySQL Server,执行 SQL。
5. 响应执行 SQL 结果【单库单表】插入(04执行响应)【 1 - 4 】
处理 MySQL Server 响应数据包。
【 5 - 8 】
发送插入成功结果给 MySQL Client。
领取专属 10元无门槛券
私享最新 技术干货