路由引擎
2022-05-20 09:32:22 1 举报
sharding-路由引起
作者其他创作
大纲/内容
根据配置文件中配置的分库的分片键以及分表的分片键,拿到shardingConditon中对应的RouteValue,进行创建DataNodes
若是insert语句且有需要自动生成列
StandardShardingStrategy.doSharding根据RouteValue的类型判断时精确还是范围找到对应的分片算法,执行自定义的分片算法拿到真实表名
创建RoutingEngine,并执行路由
根据返回的DataNode构建RoutingUnit(物理库名,tableUnit中逻辑和物理表名)
SimpleQueryShardingEngine(route)
查询select:还要构建groupByContext、orderByContext等查询相关条件
SQLParseEngine(sql解析结果sqlStatement)
1、设置sqlStament属性2、设置tableContext属性(表名啥的)
StatementRoutingEngine(route)
StandardRoutingEngine.routeTables根据分表的RouteValue以及自己配置的分表算法拿到真实表名
整体上下游流程:
ShardingRouter(parse)重点**
PreparedQueryShardingEngine(route)
对SQLStatement合理性验证
根据sql类型创建不同的RoutingEngine
getDataNodes根据tableRule获取DataNode
构建SQLRouteResult返回
InsertStatement则自动生成主键
构建RouteValue(shardingCondition的属性,只构建分片键的)
创建分片条件ShardingConditions及优化
BaseShardingEngine(executeRoute)
ShardingInsertStatementValidator(插入验证器)
不能update中修改分片键的值
PreparedStatementRoutingEngine(route)
将构建好的RoutingUnit塞入RoutingResult,返回RoutingResult
ShardingUpdateStatementValidator(修改验证器)
构建SQLStatementContext
insert中包含了主键的值
INSERT INTO .... ON DUPLICATE KEY不支持分库分表键
根据sqlStatement判断是insert还是update,分别构建不同的校验规则,进行校验
根据配置的key-generator(比如雪花)生成key,构建GeneratedKey(主键名,主键值)
insert中不包含主键的值
遍历ShardingConditions(实际上一条insert一句shardingConditons就一个,就是分片键的信息)
insert语句
update和delete语句
可以看到其实RoutingEngine中存的都是之前得到的信息
非dml(insert、update、delete)语句不构建ShardingConditions
ShardingRouter.parse核心步骤
拿到参数中的主键值,构建GeneratedKey(主键名,主键值)
RoutingEngine.route()
插入insert:还要构建列、inser的value值信息
StandardRoutingEngine.routeDataSources先根据分库的RouteValue以及自己配置的分库算法拿到真实的库名
构建DataNode,属性为物理库名,表名,将DadaNode也塞入shardingConditon中,返回DataNode
StandardShardingStrategy.doSharding根据RouteValue的类型判断时精确还是范围找到对应的分片算法,执行自定义的分片算法拿到真实库名
0 条评论
下一页