ShardingJdbc2.X学习总结系列(五):源码解析—SQL路由

本文深入探讨了ShardingJdbc2.X中的SQL路由过程,包括DatabaseHintSQLRouter和ParsingSQLRouter两个实现类。文章详细阐述了路由的6个关键步骤:获取分库分表规则、获取分库和分表字段值、根据规则确定真实数据库和表,以及转换为RoutingResult。通过实例展示了如何根据配置的分片策略执行数据路由。
摘要由CSDN通过智能技术生成

上篇主要介绍了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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值