Shardingsphere-jdbc 分片源码自我总结分析

本文深入剖析了Shardingsphere-jdbc的分片源码,涉及PartialSQLRouteExecutor、ShardingSQLRouter和ShardingStandardRoutingEngine等关键组件,详细解释了如何根据分片键进行数据库路由,以及数据节点的确定过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果查询包含分片键, 将分片的逻辑库转化为真实库的分片执行代码.

PartialSQLRouteExecutor#route

 public RouteContext route(final ConnectionContext connectionContext, final QueryContext queryContext, final ShardingSphereRuleMetaData globalRuleMetaData, final ShardingSphereDatabase database) {
   
        RouteContext result = new RouteContext();
        Optional<String> dataSourceName = findDataSourceByHint(queryContext.getSqlStatementContext(), database.getResourceMetaData().getDataSources());
        if (dataSourceName.isPresent()) {
   
        // Hint模式直接返回
            result.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName.get(), dataSourceName.get()), Collections.emptyList()));
            return result;
        }
        // 如果有多个路由规则,则需要处理每个规则的不同路由策略
        for (Entry<ShardingSphereRule, SQLRouter> entry : routers.entrySet()) {
   
            if (result.getRouteUnits().isEmpty()) {
   
            // RouteUnit --> 保存的是 逻辑库和真实库的映射关系 及 逻辑表和实际表的映射关系. 
            //分片路由执行的方法 ShardingSQLRouter#createRouteContext
                result = entry.getValue().createRouteContext(queryContext, globalRuleMetaData, database, entry.getKey(), props, connectionContext);
            } else {
   
                entry.getValue().decorateRouteContext(result, queryContext, database, entry.getKey(), props, connectionContext);
            }
        }
        // RouteUnit 记录的是每个数据源中的真实库/表的映射关系; 
        if (result.getRouteUnits().isEmpty() && 1 == database.getResourceMetaData().getDataSources()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值