前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『互联网架构』软件架构-Sharding-Sphere特性详解(67)

『互联网架构』软件架构-Sharding-Sphere特性详解(67)

作者头像
IT架构圈
发布2019-06-05 15:32:17
7170
发布2019-06-05 15:32:17
举报
文章被收录于专栏:IT架构圈

上次通过源码的方式演示了sharding-sphere,分库分表的实现,还有他的原理,不知道老铁拿到代码后跑一下看看。如果试过的老铁,麻烦在评论里面回复下。这次围绕上次分库分表,继续说下shardingShpere是如何做到的代码层面是如何实现的。分库分表写入的都是逻辑表,很多语句都是要进行改写的。 源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-Sharding-Sphere特性详解(66)/shardingJdbc

JDBC规范重写
(一)SQL解析

1.数据库类型dbType; 2.分库分表规则shardingRule; 3.词法分析器引擎lexerEngine;

SQL语句

代码语言:javascript
复制
SELECT
a.id
a.name
FROM order a
WHERE a.id = 1

解析成

实例代码

代码语言:javascript
复制
@Test
 public void assertParseWithoutParameter() throws SQLException {
 ShardingRule shardingRule = createShardingRule();//创建分片规则
 SQLParsingEngine statementParser = new SQLParsingEngine(DatabaseType.MySQL, "INSERT INTO `TABLE_XXX` (`field1`, `field2`) VALUES (10, 1)", shardingRule);//解析sql引擎
 InsertStatement insertStatement = (InsertStatement) statementParser.parse();//解析sql开始
 System.out.println("sql解析tables:"+insertStatement.getTables());
 List<SQLToken> list=insertStatement.getSqlTokens();
 for(SQLToken sqlToken:list){
 System.out.println(sqlToken);
 }
 System.out.println("toString:"+insertStatement.toString());
 }

SQL语句拆解成TokenType的对象,

(二)SQL路由

路由方式分为:单表(single)、联表(binding) 混合(mix) 经过 SQL解析、SQL路由后,产生SQL路由结果,即 SQLRouteResult。根据路由结果,生成SQL,执行SQL。 io.shardingjdbc.core.routing.router.SQLRouter#parse 解析接口 io.shardingjdbc.core.routing.router.SQLRouter#route 路由接口

DatabaseHintSQLRouter,基于数据库提示的路由器 ParsingSQLRouter,需要解析的SQL路由器

代码语言:javascript
复制
<sharding:props>    <prop key="sql.show">true</prop></sharding:props>
  • 单表

全表查询

通过查询指定路由到表

  • 联表

联表-单库

  • 混合
(三)SQL改写

SQLRewriteEngine,SQL重写引擎,实现 SQL 改写、生成功能

(四)SQL执行

解析完成sql、路由也完成了,现在进行真正执行的时候了。

  • ExecutorEngine> sql执行引擎 com.google.common.util.concurrent.ListeningExecutorService 线程池
  • PreparedStatementExecutor>预编译sql执行器

io.shardingjdbc.core.executor.ExecutorEngine#executePreparedStatement

  • EventBus>Sql执行事件 io.shardingjdbc.core.executor.event.EventExecutionType 三种类型事件
(五)结果归集

改写sql会变成多条,这个时候我们就需要把每个库查出来的结果合并。主要是:分页、分组、排序、聚合、迭代。

归并结果集接口

SQL

意义

OrderByStreamResultSetMerger

SELECT * FROM t_order ORDER BY id

排序

GroupByStreamResultSetMerger

SELECT uid, AVG(id) FROM t_order GROUP BY uid

分组

GroupByMemoryResultSetMerger

SELECT uid FROM t_order GROUP BY id ORDER BY id DESC

分组 排序

IteratorStreamResultSetMerger

SELECT * FROM t_order

迭代

LimitDecoratorResultSetMerger

SELECT * FROM t_order ORDER BY id LIMIT 10

分页

PS:这篇写的比较琐碎,没说太多源码只是通过图片的方式说明流程:sql语句,sql路由,sql改写,sql执行这几种方式来针对sql进行分库分表,到实战的时候好好说下吧。目前的shardingjdbc里面有个proxy,nativecat可以直接访问proxy的形式来操作逻辑表的方式,来底层操作物理表。如果分库分表比较多的话,不通过proxy来完成的话,真是一场灾难。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JDBC规范重写
    • (一)SQL解析
      • (二)SQL路由
        • (三)SQL改写
          • (四)SQL执行
            • (五)结果归集
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档