内容简介:上次通过源码的方式演示了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
####JDBC规范重写
(一)SQL解析
1.数据库类型dbType;
2.分库分表规则shardingRule;
3.词法分析器引擎lexerEngine;
SQL语句
SELECT a.id a.name FROM order a WHERE a.id = 1
解析成
实例代码
@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路由器
<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来完成的话,真是一场灾难。
>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:上一篇:已是最新文章
以上所述就是小编给大家介绍的《『互联网架构』软件架构-Sharding-Sphere特性详解(67)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 详解HBase架构原理
- REST架构风格详解
- 分布式微服务架构体系详解
- 详解RAC并发逻辑、硬件架构、软件架构拓扑与原理解析
- 详解 Spring Session 架构与设计
- 微服务布道师:详解微服务架构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深度探索C++对象模型
斯坦利•B.李普曼 (Stanley B. Lippman) / 侯捷 / 电子工业出版社 / 2012-1 / 69.00元
作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。 本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模......一起来看看 《深度探索C++对象模型》 这本书的介绍吧!