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

栏目: 数据库 · 发布时间: 5年前

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

上次通过源码的方式演示了sharding-sphere,分库分表的实现,还有他的原理,不知道老铁拿到代码后跑一下看看。如果试过的老铁,麻烦在评论里面回复下。这次围绕上次分库分表,继续说下shardingShpere是如何做到的代码层面是如何实现的。分库分表写入的都是逻辑表,很多语句都是要进行改写的。

源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-Sharding-Sphere特性详解(66)/shardingJdbc

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

####JDBC规范重写

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

(一)SQL解析

1.数据库类型dbType;

2.分库分表规则shardingRule;

3.词法分析器引擎lexerEngine;

SQL语句

SELECT
a.id
a.name
FROM order a
WHERE a.id = 1

解析成

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

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

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

实例代码

@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());
    }

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

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 路由接口

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

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

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

DatabaseHintSQLRouter,基于数据库提示的路由器

ParsingSQLRouter,需要解析的SQL路由器

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

<sharding:props>
    <prop key="sql.show">true</prop>
</sharding:props>
  • 单表

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

全表查询

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

通过查询指定路由到表

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

  • 联表

联表-单库

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

  • 混合

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

(三)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会变成多条,这个时候我们就需要把每个库查出来的结果合并。主要是:分页、分组、 排序 、聚合、迭代。

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

归并结果集接口 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来完成的话,真是一场灾难。

百度未收录

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!

>>原文链接地址:上一篇:

已是最新文章


以上所述就是小编给大家介绍的《『互联网架构』软件架构-Sharding-Sphere特性详解(67)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

勇敢新世界‧互聯網罪與罰

勇敢新世界‧互聯網罪與罰

許煜、劉細良 / CUP / 2005 / $48

我天天上網數小時,為的是要在節目裡面介紹世界的最新動態,尤其是網絡這個世界本身日新月異的變化。所以我不可能不注意到BT、共享軟件、 Wikipedia、網絡監管等各種影響政治、社會、經濟及文化的重要網絡現象。但是我發現市面上一直沒有一本內容充實全面,資料切時的中文參考書,直到這本《互聯網罪與罰》。而且,最大的驚喜是它易讀好看,簡直就像故事書。 梁文道 鳳凰衛視 《網羅天下......一起来看看 《勇敢新世界‧互聯網罪與罰》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换