上篇主要介绍了SQL解析的过程,这一篇主要讲解的是SQL路由
首先介绍几个重要的名词+内部实现图
1.TableRule:表规则配置对象
1.1DataNode :静态分库分表数据单元
数据分片的最小单元,由数据源名称和数据表组成。
例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同,
直接配置逻辑表和真实表对应关系即可。
第一种情况,自定义分布。
actualTable 为 ${dataSourceName}.${tableName} 时,
即已经明确真实表所在数据源。
第二种情况,均匀分布。
1.2.DynamicDataNode :动态表的分库分表数据单元
逻辑表和真实表不一定需要在配置规则中静态配置。
比如按照日期分片的场景,真实表的名称随着时间的推移会产生变化。
2.ShardingRule 分库分表规则配置对象
2.1.dataSourceRule:数据源配置对象。
ShardingRule需要数据源配置正确。这点和 TableRule 是不同的。
TableRule对dataSourceRule只使用数据源名字,最终执行SQL使用数据源名字从ShardingRule获取数据源连接。
2.2.tableRules:表规则配置对象集合。
2.3.bindingTableRules:指在任何场景下分片规则均一致的主表和子表。
例:订单表和订单项表,均按照订单ID分片,则此两张表互为BindingTable关系。
BindingTable关系的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
3.ShardingStrategy 分片策略
3.1.databaseShardingStrategy :分库策略
3.2.tableShardingStrategy :分表策略
4.ShardingAlgorithm 分片算法
针对分库、分表有两个子接口。
针对分片键数量分成:无分片键算法、单片键算法、多片键算法。
其中NoneKeyDatabaseShardingAlgorithm、NoneTableShardingAlgorithm为ShardingRule
在未设置分库、分表算法的默认值。
SQLRouter接口有两个实现类:
DatabaseHintSQLRouter:通过提示且仅路由至数据库的SQL路由器
ParsingSQLRouter:需要解析的SQL路由器
路由结果:
RoutingResult:简单路由结果
CartesianRoutingResult:笛卡尔积路由结果
开始源码解析:
public SQLRouteResult route(final List<Object> parameters) {
if (null == sqlStatement) {
① sqlStatement = sqlRouter.parse(logicSQL, parameters.size());
}
return ② sqlRouter.route(logicSQL, parameters, sqlStatement);
}
上篇主要介绍了①SQL解析的源码
这里我们主要看②SQL路由解析源码。
我们进入内部方法
private RoutingResult route(final List<Object> parameters, final SQLStatement sqlStatement) {
Collection<String> tableNames = sqlState