sharding 执行流程
2021-08-14 00:47:31 12 举报
shardingJDBC 执行流程
作者其他创作
大纲/内容
shard()
new SQLAST(...)//封装解析语法树,参数索引列表,SQLStatementRule
routingEngine.route(parameters)
generateRoutingResult(...)//根据上一步中的表的数据节点集合再生成最终的路由结果
根据shardingConnection创建 ShardingStatement
isNeedMergeShardingValues(sqlStatementContext)//这一步主要检查 select 语句的子查询中是否有分片表,有的话返回 true
ShardingPreparedStatement#execute
mergeEngine.merge()//归并引擎归并
创建shardingConnection
调用getResultSet() 执行结果归并流程
parseTree = sqlParser.execute().getChild(0)//这一步调用 ANTLR 生成 SQL 解析语法树
SQLStatementContextFactory#newInstance
each.getResultSet()//获取每个Statement 查询的结果集
getShardingConditions()//获取sharding 分片条件,这一步需要解析shardingRule
ShardingDataSource#getConnection
sqlRewriteEngine.rewrite(sqlRewriteContext)//将逻辑SQL 改写成真实的SQL
MergeEngineFactory#newInstance(...)//创建归并引擎
调用ShardingPreparedStatement#execute执行 sql
new SQLRewriteContext(...)//创建 SQLRewriteContext 实例
parserEngine.parse()
initPreparedStatementExecutor()//初始化Executor,为下一步sql执行做准备
new ShardingConnection(...)
new ShardingResultSet(...)//包装结果集并返回
Collection<SQLSegment> sqlSegments = extractorEngine.extract(ast)//解析AST,获取所需要的的SQL 片段
改写后的真正的SQL 结果被添加到 SQLRouteResult.routeUnits
for (Statement each : preparedStatementExecutor.getStatements())//获取路由的 Statement 列表迭代
getDataNodes(shardingRule.getTableRule(logicTableName))//根据分表规则获取到合适的数据节点集合
收藏
0 条评论
下一页