一、需求背景与方案选型
在实际业务场景中,我们经常会遇到这样的需求:某些核心业务表需要按月分表存储历史数据,同时存在大量不需要分表的常规业务表。本文将基于 Spring Boot + MyBatis-Plus + ShardingSphere 技术栈,演示如何实现混合数据源的分表与单表共存配置。
二、环境准备
1. 核心依赖版本
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc</artifactId>
<version>5.5.1</version>
</dependency>
2. 基础配置(application.yml)
spring:
application:
name: application
main:
#允许在容器中覆盖已存在的 Bean
allow-bean-definition-overriding: true
shardingsphere:
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: 123456
三、分表配置实现
/**
* 分表配置类
*/
@Data
@Slf4j
@Configuration
@ConfigurationProperties(prefix = "spring.shardingsphere")
public class ShardingSphereConfig {
@NotNull
private String driverClassName;
@NotNull
private String url;
@NotNull
private String username;
@NotNull
private String password;
DruidDataSource getDruidDataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
@Bean
public DataSource createShardingSphereDataSource() throws Exception {
// 配置数据源
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("test", getDruidDataSource());
// 创建 ShardingRuleConfiguration
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
// 配置 tablename 表规则
ShardingTableRuleConfiguration tableRuleConfig = new ShardingTableRuleConfiguration("tablename", "test" + ".tablename$->{2020}${0}${1..9}," + "test" + ".tablename_$->{2020}${10..12}");
tableRuleConfig .setTableShardingStrategy(new StandardShardingStrategyConfiguration("date", "date_inline"));
shardingRuleConfig.getTables().add(tableRuleConfig );
// 配置 tablename 表的分片算法
Properties intervalProps = new Properties();
intervalProps.setProperty("datetime-pattern", "yyyyMM");
intervalProps.setProperty("datetime-lower", "202001");
intervalProps.setProperty("datetime-upper", "202012");
intervalProps.setProperty("sharding-suffix-pattern", "yyyyMM");
intervalProps.setProperty("datetime-interval-amount", "1");
intervalProps.setProperty("datetime-interval-unit", "MONTHS");
shardingRuleConfig.getShardingAlgorithms().put("date_inline", new AlgorithmConfiguration("INTERVAL", intervalPropsBill));
return ShardingSphereDataSourceFactory.createDataSource("test", dataSourceMap, ruleConfigs, props);
}
}
如果库中单表和分表混合,那就需要加上单表的配置
// 创建 SingleRuleConfiguration(单表规则)
SingleRuleConfiguration singleRuleConfig = new SingleRuleConfiguration();
singleRuleConfig.setTables(Collections.singletonList("*.*")); // 加载所有单表
// 将单表规则加入规则集合
ruleConfigs.add(singleRuleConfig); // 单表规则
以上便是配置分表的配置
🌟 致创新者的寄语
技术合规不是创意的枷锁,而是商业化的基石。愿每个技术理想都能找到合规落地的航道,与平台规则共舞,在数字世界绽放独特光芒。
💬 互动话题
你在开发过程中遇到过哪些"意想不到"的问题?欢迎留言交流经验!