shardingjdbc如何自定义分表策略以及实战实例
时间: 2023-08-22 15:08:31 浏览: 174
Sharding-JDBC 是一款基于 JDBC 的分布式数据库中间件,它提供了分库分表、读写分离、分布式事务等功能。而自定义分表策略就是 Sharding-JDBC 中非常重要的一部分。
下面我来介绍一下如何自定义分表策略以及实战实例:
1. 自定义分表策略
Sharding-JDBC 自带了一些默认的分表策略,例如按照取模分表、按照日期分表等。但如果默认分表策略不能满足我们的需求,我们可以自定义分表策略。
自定义分表策略需要实现 `PreciseShardingAlgorithm` 接口,该接口包含两个方法:
- `doSharding(Collection<String> availableTargetNames, PreciseShardingValue shardingValue)`:根据分片键和可用的分片数据源名称集合进行分片计算,返回分片后的数据源名称。
- `getType()`:返回分片算法名称。
下面是一个自定义按照用户 ID 分表的分表策略:
```java
public class UserIdShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(shardingValue.getValue() % 10)) {
return tableName;
}
}
throw new UnsupportedOperationException();
}
@Override
public String getType() {
return "USER_ID";
}
}
```
2. 实战实例
下面是一个使用 Sharding-JDBC 的 Spring Boot 实战示例,该示例演示了如何使用自定义分表策略按照用户 ID 分表:
1. 引入依赖:
```xml
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding-jdbc.version}</version>
</dependency>
```
2. 编写配置文件:
```yaml
spring:
shardingsphere:
datasource:
names: ds0, ds1
ds0:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db0?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
username: root
password: root
ds1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
username: root
password: root
sharding:
tables:
user:
actual-data-nodes: ds$->{0..1}.user_$->{0..9}
table-strategy:
inline:
sharding-column: user_id
algorithm-expression: user_$->{user_id % 10}
key-generator:
column: user_id
type: SNOWFLAKE
default-database-strategy:
inline:
sharding-column: user_id
algorithm-expression: ds$->{user_id % 2}
props:
sql.show: true
```
3. 编写自定义分表策略:
```java
public class UserIdShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(shardingValue.getValue() % 10)) {
return tableName;
}
}
throw new UnsupportedOperationException();
}
@Override
public String getType() {
return "USER_ID";
}
}
```
4. 在 Spring Boot 中配置自定义分表策略:
```java
@Configuration
public class ShardingConfig {
@Autowired
private DataSource dataSource;
@Bean
public ShardingRule shardingRule() {
TableRule userTableRule = TableRule.builder("user")
.actualTables(Arrays.asList("user_0", "user_1", "user_2", "user_3", "user_4", "user_5", "user_6", "user_7", "user_8", "user_9"))
.dataSourceRule(dataSourceRule())
.tableShardingStrategy(new TableShardingStrategy("user_id", new UserIdShardingAlgorithm()))
.keyGenerator(new KeyGeneratorConfiguration("SNOWFLAKE", "user_id"))
.build();
return ShardingRule.builder()
.dataSourceRule(dataSourceRule())
.tableRules(Arrays.asList(userTableRule))
.databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new InlineShardingStrategy("user_id", "ds$->{user_id % 2}")))
.build();
}
@Bean
public DataSourceRule dataSourceRule() {
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("ds0"));
dataSourceMap.put("ds1", createDataSource("ds1"));
return new DataSourceRule(dataSourceMap);
}
private DataSource createDataSource(final String dataSourceName) {
DruidDataSource result = new DruidDataSource();
result.setDriverClassName("com.mysql.cj.jdbc.Driver");
result.setUrl(String.format("jdbc:mysql://localhost:3306/%s?useSSL=false&serverTimezone=GMT%%2B8&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true", dataSourceName));
result.setUsername("root");
result.setPassword("root");
return result;
}
@Bean
public DataSource dataSource() throws SQLException {
return new ShardingDataSource(shardingRule());
}
}
```
在上面的示例中,我们使用了自定义的按照用户 ID 分表的分表策略。在 `ShardingConfig` 类中,我们使用 `DataSourceRule` 和 `ShardingRule` 配置数据源和分片规则,并且使用自定义的分表策略和分库策略。在 `application.yaml` 文件中,我们配置了数据源和表的分片规则以及自定义的分表策略。
以上就是关于如何自定义分表策略以及实战实例的介绍。
阅读全文