美文网首页Java
[zebra源码]分片语句ShardPreparedStatem

[zebra源码]分片语句ShardPreparedStatem

作者: holysu | 来源:发表于2021-04-27 00:05 被阅读0次
image.png

主要过程包括:

  1. 分库分表的路由定位
  2. sql语句的 ast 抽象语法树的解析
  3. 通过自定义 SQLASTVisitor (MySQLSelectASTVisitor) 遍历sql ast,解析出逻辑表名
  4. 查找逻辑表名对应的分库分表规则
  5. 根据逻辑表的分库分表规则,遍历sql ast定位分片键的值 根据中间件的设计需要支持分库分表语句的各种sql场景,遍历ast树,做一堆if else判断 (分库分表后,不应该支持复杂的sql,可酌情考虑公司业务场景 需要支持的sql语句 来遍历 sql树)
  6. SqlRewrite#rewrite 改写 sql语句,根据逻辑表的分库分表规则和分片键的值,将逻辑表名改写成目标物理表名; 改写后的sql即为在目标分库中执行的真实SQL 改写sql的过程也是利用 SQLASTVisitor 来操作的,不过用的自定义的 ShardRewriteTableOutputVisitor (继承输出型visitor:SQLASTOutputVisitor)来遍历 sql tree 输出sql字符串, 遇到 SQLExprTableSource 节点的时候改写表名
  7. 路由到目标的分库和分表 可能是多个库和表, #reWriteAndMergeParams 会把sql参数塞到所有重写后的的分表sql语句中
  8. 后面再执行的时候 会根据 路由结果是不是多个分库,按照配置单库并发度 concurrencyLevel (默认是1)来决定在每个目标分库中不同表的sql是用一个java 线程还是多个java线程并行执行, 具体过程 参考 如果定位到多个分库表怎么执行的?

相关文章

  • [zebra源码]分片语句ShardPreparedStatem

    主要过程包括: 分库分表的路由定位 sql语句的 ast 抽象语法树的解析 通过自定义 SQLASTVisitor...

  • [zebra源码]不带分片键的sql会怎么执行?

    TableShardRule#eval 根据路由规则解析sql的时候如果没匹配找到分片键的值 如果是 insert...

  • zebra源码结构

    zebra-client(核心) : 除了监控外,几乎zebra所有核心功能,如读写分离、分库分表、就近路由、流量...

  • [zebra源码]流控设计

    之所以要进行流量控制,是要避免业务应用流出量倾斜,超过分库能承载的压力 zebra的限流架构 粒度 指定要保护的d...

  • React Fiber 任务分片 & 时间分片

    源码基于react@16.13.1 Fiber 是一个工作单元,它的引入是react实现任务分片和时间分片的基础。...

  • Druid的SQL Parser

    最近在看zebra的分库分表源码部分所使用的sql解析就是采用的SQL Parser,这里写个简单的举例方便新手理...

  • Lodash 源码阅读 —— chunk

    Lodash 源码阅读 —— chunk 这里我先给出源码: 下面是分片段来解读: 这一段代码的意思是说,如果传入...

  • 复习计划

    Zebra 练习使用 Maven 的对 zebra 进行分层管理 复习并行知识 学习 zookeeper 在集群中...

  • Zebra

    I asked the Zebra, Are you black with white stripes? Or a...

  • ShardingSphere官网及总结

    中文文档 分片 分片算法 精确分片算法 范围分片算法 复合分片算法 Hint分片算法 分片策略 标准分片策略 复合...

网友评论

    本文标题:[zebra源码]分片语句ShardPreparedStatem

    本文链接:https://www.haomeiwen.com/subject/xtnyrltx.html