数据库中间件 MyCAT 源码分析

1. 前言

本文讲解 【单库单表】插入 所涉及到的代码。交互如下图:

.

整个过程,MyCAT Server 流程如下:

接收 MySQL Client 请求,解析 SQL。

获得路由结果,进行路由。

获得 MySQL 连接,执行 SQL。

响应执行结果,发送结果给 MySQL Client。

我们逐个步骤分析,一起来看看源码。

2. 接收请求,解析 SQL

.

【 1 - 2 】

接收一条 MySQL 命令。在【1】之前,还有请求数据读取、拆成单条 MySQL SQL。

【 3 】

不同 MySQL 命令,分发到不同的方法执行。核心代码如下:

.

INSERT

/SELECT/UPDATE/DELETE 等 SQL 归属于 MySQLPacket.COM_QUERY,详细可见:《MySQL协议分析#4.2 客户端命令请求报文(客户端 -> 服务器)》。

##【 4 】

将 二进制数组 解析成 SQL。核心代码如下:

.

##【 5 】

解析 SQL 类型。核心代码如下:

.

.

##【 6 】

执行 SQL,详细解析见下文,核心代码如下:

.

.

3. 获得路由结果

.

【 1 - 2 】【 12 】

获得路由主流程。核心代码如下:

.

.

路由 详细解析,我们另开文章,避免内容过多,影响大家对【插入】流程和逻辑的理解。

【 3 - 6 】

路由前置处理。当符合如下三种情况下,进行处理:

{ 1 } 使用全局序列号:

.

{ 2 } ER 子表插入

{ 3 } 主键使用自增 ID 插入:

.

RouterUtil.java

处理 SQL 考虑性能,实现会比较 C-style,代码咱就不贴了,传送门:github.com/YunaiV/Myca… (该仓库从官方 Fork,逐步完善中文注释,欢迎 Star)

【 7 - 11 】

当前置路由处理全局序列号时,添加到全局序列处理器(MyCATSequnceProcessor)。该处理器会异步生成 ID,替换 SQL 内的 NEXT VALUE FOR MYCATSEQ_ 正则。例如:

.

异步处理完后,调用 ServerConnection#routeEndExecuteSQL(sql, type, schema) 方法重新执行 SQL。

核心代码如下:

.

.

此处有个疑问:MyCATSequnceProcessor 是单线程,会不会插入性能有一定的影响?后续咱做下性能测试。

.

【 1 - 8 】

获得 MySQL 连接。

PhysicalDBNode :物理数据库节点。

PhysicalDatasource :物理数据库数据源。

【 9 - 13 】

发送 SQL 到 MySQL Server,执行 SQL。

5. 响应执行 SQL 结果

.

【 1 - 4 】

【 5 - 8 】

发送插入成功结果给MySQL Client。

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

扫码关注云+社区

领取腾讯云代金券