You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:25:21