阿飞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 ShardingDataSource(shardingRule);
}