Sharding-JDBC 实战 - 分片策略1:标准分片策略StandardShardingStrategy
什么是分片策略
分片策略是指在进行数据库分库分表时,如何将数据按照一定的规则分配到不同的数据库和数据表中的策略。Sharding-JDBC 提供了多种分片策略,以满足不同场景下的需求。其中,标准分片策略(StandardShardingStrategy)是最常用的一种。
标准分片策略概述
标准分片策略(StandardShardingStrategy)通过指定的分片键和分片算法将数据分配到不同的库表中。它适用于绝大多数分片场景。分片键通常是一个或多个字段,通过这些字段的值来决定数据应该存储在哪个库表中。
使用步骤
-
引入依赖
在 Maven 项目中引入 Sharding-JDBC 依赖:<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>4.1.1</version> </dependency>
-
配置数据源
配置多个数据源,并将其注册到ShardingDataSource
中:Map<String, DataSource> dataSourceMap = new HashMap<>(); dataSourceMap.put("ds0", createDataSource("ds0")); dataSourceMap.put("ds1", createDataSource("ds1")); // 配置分片规则 ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
-
配置标准分片策略
配置分片规则,指定逻辑表、实际表、分片键和分片算法:TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}"); orderTableRuleConfig.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new OrderShardingAlgorithm())); orderTableRuleConfig.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new DatabaseShardingAlgorithm())); shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
-
实现分片算法
实现自定义的分片算法,分别用于数据库和表的分片:public class OrderShardingAlgorithm implements PreciseShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { for (String targetName : availableTargetNames) { if (targetName.endsWith(shardingValue.getValue() % 2 + "")) { return targetName; } } throw new UnsupportedOperationException(); } } public class DatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) { for (String targetName : availableTargetNames) { if (targetName.endsWith(shardingValue.getValue() % 2 + "")) { return targetName; } } throw new UnsupportedOperationException(); } }
-
配置 ShardingDataSource
创建ShardingDataSource
并初始化:DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
示例
假设有一个订单表 t_order
,我们将其分成两个数据库 ds0
和 ds1
,每个数据库中有两个实际表 t_order_0
和 t_order_1
。分片规则是根据 order_id
进行表分片,根据 user_id
进行库分片。
public class ShardingJDBCExample {
public static void main(String[] args) throws SQLException {
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("ds0"));
dataSourceMap.put("ds1", createDataSource("ds1"));
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}");
orderTableRuleConfig.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new OrderShardingAlgorithm()));
orderTableRuleConfig.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new DatabaseShardingAlgorithm()));
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
}
private static DataSource createDataSource(String dataSourceName) {
// 创建数据源的具体代码,通常使用数据库连接池如 Druid、HikariCP 等
}
}
通过以上配置,Sharding-JDBC 会根据 order_id
和 user_id
的值将数据分片到对应的数据库和表中,从而实现数据的水平扩展。
结论
标准分片策略是 Sharding-JDBC 中最常用的一种分片策略,适用于大多数场景。通过配置标准分片策略,可以灵活地根据业务需求实现数据的分库分表,提升数据库的性能和扩展性。在实际应用中,可以根据具体的分片需求调整分片算法,以满足业务需求。