首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库中间件 MyCAT源码分析:单库单表插入

本文主要基于 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。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180213G05EHU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券