基于Testcontainers、MariaDB、ShardingSphere与Flyway的分片集成测试配置求助
多分片环境下Testcontainers+MariaDB+ShardingSphere+Flyway集成测试配置方案
一、先修正你数据源配置里的问题
- YAML语法错误:
shardingsphere.datasource.names末尾多了个逗号,这会导致配置解析失败,直接删掉即可 - 数据库名配置无效:你添加的
name字段不是BasicDataSource的合法配置项,要指定数据库名得直接写在Testcontainers的JDBC URL中,比如jdbc:tc:mariadb:10.6.7:///testapi01,这样Testcontainers会自动在容器内创建对应的数据库 - 修正后的完整配置:
spring: config: activate: on-profile: test shardingsphere: datasource: names: test-api-1, test-api-2, test-api-3 test-api-1: type: org.apache.commons.dbcp2.BasicDataSource driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver url: jdbc:tc:mariadb:10.6.7:///testapi01 validationQuery: /* ping */ select 1 username: root password: root1234 test-api-2: type: org.apache.commons.dbcp2.BasicDataSource driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver url: jdbc:tc:mariadb:10.6.7:///testapi02 validationQuery: /* ping */ select 1 username: root password: root1234 test-api-3: type: org.apache.commons.dbcp2.BasicDataSource driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver url: jdbc:tc:mariadb:10.6.7:///testapi03 validationQuery: /* ping */ select 1 username: root password: root1234
二、Flyway多分片迁移的配置方案
ShardingSphere的代理数据源无法被Flyway直接识别,所以不能依赖默认的自动配置,得手动为每个分片数据源单独执行迁移脚本。
1. 调整脚本目录结构
如果所有分片的表结构一致,直接在src/test/resources/db/migration下放通用脚本即可;如果有分片专属脚本,按数据源名拆分目录:
src/test/resources/db/migration/common:所有分片都要执行的通用脚本(比如基础表结构)src/test/resources/db/migration/test-api-1:仅test-api-1需要的个性化脚本src/test/resources/db/migration/test-api-2:仅test-api-2需要的个性化脚本src/test/resources/db/migration/test-api-3:仅test-api-3需要的个性化脚本
2. 手动编写Flyway配置类
创建配置类,注入所有分片数据源,逐个初始化Flyway并执行迁移:
import org.flywaydb.core.Flyway; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.util.Map; @Configuration @Profile("test") public class FlywayShardingConfig { private final Map<String, DataSource> shardingDataSourceMap; // 注入ShardingSphere管理的所有分片数据源 public FlywayShardingConfig(Map<String, DataSource> shardingDataSourceMap) { this.shardingDataSourceMap = shardingDataSourceMap; } @PostConstruct public void migrateAllShards() { for (Map.Entry<String, DataSource> entry : shardingDataSourceMap.entrySet()) { String dsName = entry.getKey(); DataSource dataSource = entry.getValue(); // 配置Flyway,先执行通用脚本,再执行分片专属脚本 Flyway flyway = Flyway.configure() .dataSource(dataSource) .locations( "classpath:db/migration/common", "classpath:db/migration/" + dsName ) .baselineOnMigrate(true) // 空数据库自动基线化,避免首次迁移报错 .validateMigrationNaming(true) .load(); // 执行迁移 flyway.migrate(); } } }
3. 禁用默认Flyway自动配置
因为我们手动处理了迁移,需要关闭Spring Boot默认的Flyway自动配置,二选一即可:
- 在启动类添加注解:
@SpringBootApplication(exclude = FlywayAutoConfiguration.class)
- 在
application-test.yml中添加配置:
spring: flyway: enabled: false
三、测试验证注意点
- 启动测试时,Testcontainers会自动拉起3个MariaDB容器,每个对应一个分片数据源
- Flyway会自动为每个分片执行迁移脚本,确保所有分片结构符合预期
- 测试时直接使用ShardingSphere的代理数据源执行SQL,即可验证数据是否正确路由到对应分片
内容的提问来源于stack exchange,提问作者MMA
相关产品推荐
相关产品推荐

