1. sharding-jdbc源码之数据源

本文深入探讨了Sharding-JDBC的ShardingDataSource创建过程,讲解了分表和分库的原则,包括ModuloTableShardingAlgorithm与ModuloDatabaseShardingAlgorithm的实现。文中详细分析了分表策略的doEqualSharding(), doInSharding(), doBetweenSharding()方法,以及分库策略的逻辑。同时,提到了潜在的问题和解决方案,强调了在配置数据源时需注意的取模问题。" 111416465,7707812,TP5整合GatewayWorker教程:Linux与Windows适配,"['PHP', 'WebSocket', '框架整合', 'ThinkPHP5', 'GatewayWorker']

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

阿飞Javaer,转载请注明原创出处,谢谢!

com.dangdang.ddframe.rdb.sharding.example.jdbc.Main剖析分库分表配置与实现,其部分源码如下:

public final class Main {
   
   

    public static void main(final String[] args) throws SQLException {
        // step1: 配置sharding数据源
        DataSource dataSource = getShardingDataSource();
        // step2:创建表
        createTable(dataSource);
        // step3:插入数据
        insertData(dataSource);
        printSimpleSelect(dataSource);
        printGroupBy(dataSource);
        printHintSimpleSelect(dataSource);
        dropTable(dataSource);
    }
    ... ...
}

接下来分析第一步,即如何创建ShardingDataSource

①ShardingDataSource

硬编码创建ShardingDataSource的核心实现源码如下:

private static ShardingDataSource getShardingDataSource() throws SQLException {
    // 构造DataSourceRule,即key与数据源的KV对;
    DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap());
    // 建立逻辑表是t_order,实际表是t_order_0,t_order_1的TableRule
    TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList("t_order_0", "t_order_1")).dataSourceRule(dataSourceRule).build();
    // 建立逻辑表是t_order_item,实际表是t_order_item_0,t_order_item_1的TableRule
    TableRule orderItemTableRule = TableRule.builder("t_order_item").actualTables(Arrays.asList("t_order_item_0", "t_order_item_1")).dataSourceRule(dataSourceRule).build();
    ShardingRule shardingRule = ShardingRule.builder()
                .dataSourceRule(dataSourceRule)
                .tableRules(Arrays.asList(orderTableRule, orderItemTableRule))
                // 增加绑定表--绑定表代表一组表,这组表的逻辑表与实际表之间的映射关系是相同的。比如t_order与t_order_item就是这样一组绑定表关系,它们的分库与分表策略是完全相同的,那么可以使用它们的表规则将它们配置成绑定表,绑定表所有路由计算将会只使用主表的策略;
                .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))))
                // 指定数据库sharding策略--根据user_id字段的值取模
                .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()))
                // 指定表sharding策略--根据order_id字段的值取模
                .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm())).build();
    return new ShardingDataS
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值