Spring Boot配置多MySQL/MariaDB数据源及运行时故障切换方案咨询
多数据源配置问题修复
现有配置错误点
当前配置存在以下几处直接导致次数据源无法加载的错误:
- 配置类命名冲突:第二个数据源的配置类类名仍为
aConfiguration,Spring容器类扫描时会出现同名类冲突,仅会实例化先扫描到的配置类 @Primary注解滥用:Spring容器中同类型的Bean仅允许一个标记为@Primary,次数据源所有Bean上的@Primary注解需要全部删除- 重复注册Bean:两个配置类中都定义了
entityManagerFactoryBuilderBean,出现同名称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
相关产品推荐
相关产品推荐

