当前位置: 首页 > news >正文

Spring Boot多数据源配置实战指南

在 Spring Boot 中实现多数据源拆分,需根据业务需求(如读写分离、模块隔离、多租户等)选择合适的方案。以下是核心思路及实现方式:


🔧 一、配置多个数据源

application.yml 中为每个数据源定义独立配置:

spring:datasource:primary:url: jdbc:mysql://localhost:3306/db1username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driversecondary:url: jdbc:mysql://localhost:3306/db2username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

通过 @Configuration 类创建多个 DataSource Bean:

@Configuration
public class DataSourceConfig {// 主数据源@Bean@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}// 从数据源@Bean@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}
}

🔀 二、动态数据源切换(核心方案)

1. 继承 AbstractRoutingDataSource

自定义路由类,根据线程上下文选择数据源:

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType(); // 返回数据源标识(如"primary")}
}
2. 管理数据源上下文

通过 ThreadLocal 存储当前线程的数据源标识:

public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dsType) {contextHolder.set(dsType);}public static String getDataSourceType() {return contextHolder.get();}public static void clear() {contextHolder.remove();}
}
3. 通过 AOP 自动切换

使用自定义注解(如 @DS("secondary"))标注方法,在切面中动态切换数据源:

@Aspect
@Component
public class DataSourceAspect {@Before("@annotation(ds)")public void switchDataSource(JoinPoint point, DS ds) {DataSourceContextHolder.setDataSourceType(ds.value()); }@After("@annotation(ds)")public void restoreDataSource(DS ds) {DataSourceContextHolder.clear(); }
}

📦 三、分包管理方案(替代方案)

将不同数据源的 DAO/Mapper 分别放入独立包路径,并为每个包配置独立的 SqlSessionFactory

@Configuration
@MapperScan(basePackages = "com.example.dao.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {@Beanpublic SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}
}

适用场景:业务模块边界清晰、数据源切换频率低。


⚠️ 四、事务管理

多数据源需单独配置事务管理器,避免跨库事务问题:

@Bean
public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}

注意:跨数据源操作如需强一致性,需引入分布式事务(如 Atomikos)。


🎯 五、适用场景

场景方案推荐
读写分离动态路由 + AOP 注解切换
业务模块隔离分包管理 + 独立事务管理器
多租户动态路由(按租户标识切换)
分库分表ShardingSphere 集成

💡 关键注意事项

  1. 避免循环依赖:配置类中需明确 @Primary 数据源。
  2. 连接池配置:为每个 DataSource 单独设置连接池参数(如 HikariCP)。
  3. 性能监控:多数据源需独立监控 SQL 执行性能。
  4. 跨库查询限制:尽量避免跨库关联查询,可通过冗余字段或业务层拼接解决。

动态路由方案灵活性高但复杂度稍高,适合高频切换场景;分包方案更简单直观,适合模块化架构。根据实际业务负载和团队技术储备选择。

相关文章:

  • 目标检测之YOLOv5到YOLOv11——从架构设计和损失函数的变化分析
  • 【Linux指南】文件管理高级操作(复制、移动、查找)
  • 基于ComfyUI与Wan2.1模型的本地化视频生成环境搭建指南
  • 音视频全链路开发实践:基于SmartMediakit的架构设计与应用实战
  • vivado使用非自带的第三方编辑器
  • js逻辑:【增量更新机制】
  • 如何在 Vue 应用中嵌入 ONLYOFFICE 编辑器
  • 设计模式-三大工厂
  • 深入理解JavaScript设计模式之迭代器模式
  • STM32 串口通信②:蓝牙模块HC-05控制单片机
  • LSTM、GRU 与 Transformer网络模型参数计算
  • 1931. 用三种不同颜色为网格涂色
  • Spring Boot 集成 Apache Kafka 实战指南
  • Java面试复习:基础、并发、JVM及框架核心考点解析
  • 云零售新中枢:定制化“开源AI智能名片+S2B2C商城小程序”驱动的沉浸式触点进化论
  • Restormer: Efficient Transformer for High-Resolution Image Restoration 论文阅读
  • ✨通义万相2.1深度解析:AI视频生成引擎FLF2V-14B全流程指南(命令行参数+模型架构+数据流)
  • systemd[1]: Failed to start LSB: Bring up/down networking
  • [Java恶补day31] 21. 合并两个有序链表
  • 设计模式 | 单例模式
  • 用流媒体做的电台网站/亚马逊的免费网站
  • 芜湖网站建设全包仅需800元/设计网站官网
  • 做海报的网站知乎/百度竞价推广方案的制定
  • 武汉哪些网站建设/免费搭建网站
  • 武汉响应式网站建设/免费网站 推广网站
  • 玄天教学网站建设/互联网营销师课程