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

Spring Boot配置多MySQL/MariaDB数据源及运行时故障切换方案咨询

多数据源配置问题修复

现有配置错误点

当前配置存在以下几处直接导致次数据源无法加载的错误:

  • 配置类命名冲突:第二个数据源的配置类类名仍为aConfiguration,Spring容器类扫描时会出现同名类冲突,仅会实例化先扫描到的配置类
  • @Primary注解滥用:Spring容器中同类型的Bean仅允许一个标记为@Primary,次数据源所有Bean上的@Primary注解需要全部删除
  • 重复注册Bean:两个配置类中都定义了entityManagerFactoryBuilder Bean,出现同名称Bean注册冲突,仅保留主数据源配置类中的该Bean即可
  • 事务管理器参数错误:次数据源的bTransactionManager方法中错误传入了主数据源的aEntityManagerFactory,导致次数据源事务绑定到主数据源
  • Repository未按包划分:需要确保操作主库的Repository全部放在a.b.c.d.e包下,操作次库的Repository全部放在u.v.w.x.y包下,否则JPA会绑定到默认主数据源

修复后的次数据源配置示例

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "u.v.w.x.y",
        entityManagerFactoryRef = "bEntityManagerFactory",
        transactionManagerRef = "bTransactionManager"
)
public class BConfiguration {
    @Bean
    @ConfigurationProperties("app.datasource.b")
    public DataSourceProperties bDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("app.datasource.b.configuration")
    public DataSource bDataSource() {
        return bDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

    @Bean(name = "bEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean bEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(bDataSource())
                .packages(SomeQualifiedEntity.class)
                .build();
    }

    @Bean
    public PlatformTransactionManager bTransactionManager(
            final @Qualifier("bEntityManagerFactory") LocalContainerEntityManagerFactoryBean bEntityManagerFactory) {
        return new JpaTransactionManager(bEntityManagerFactory.getObject());
    }
}
同Schema主备库无重启切换实现方案

针对同Schema的主备库故障无感知切换需求,可通过Spring自带的路由数据源实现,核心逻辑如下:

核心组件

  • 自定义路由数据源:继承AbstractRoutingDataSource,内部维护主备两个数据源实例,重写determineCurrentLookupKey方法返回当前使用的数据源标识
  • 故障检测模块:配置Hikari连接池的健康检测参数(connectionTestQuery、validationTimeout、keepaliveTime),或者单独启动定时任务,定期探测主库的可用性
  • 切换控制模块:当检测到主库不可用时,修改路由数据源的lookupKey为备库标识,同时清空原有主库的连接池,后续所有请求都会路由到备库

无重启配置更新

如果需要动态修改数据库连接地址,可配合配置中心(如Nacos、Spring Cloud Config)实现:

  • 将数据库连接配置放在配置中心,监听配置变更事件
  • 收到配置变更后,动态重建对应数据源的连接池,替换路由数据源中维护的数据源实例

注意事项

  • 切换数据源时需要等待已有事务执行完成,避免跨数据源事务异常
  • 需确保主备库的数据实时同步,可直接使用AWS RDS自带的主从同步功能
  • 切换逻辑可根据业务需求选择自动切换或人工触发切换

内容的提问来源于stack exchange,提问作者Sulaiman Ahmed Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:27:03