当前位置: 首页 > 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. 跨库查询限制:尽量避免跨库关联查询,可通过冗余字段或业务层拼接解决。

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

http://www.lqws.cn/news/496783.html

相关文章:

  • Reactor模式与Proactor模式理解
  • 【c++八股文】Day3:inline与define与constexpr
  • Android手机屏幕分为几种
  • Docker高级管理--Dockerfile镜像制作
  • 【科技公司的管理】
  • 【目标检测】图像处理基础:像素、分辨率与图像格式解析
  • Spring AI框架的实战应用指南
  • vscode 插件
  • 以玄幻小说方式打开深度学习词嵌入算法!! 使用Skip-gram来完成 Word2Vec 词嵌入(Embedding)
  • 显示任何结构的数组对象数据【向上自动滚动】
  • 七层网络模型与电脑通信比喻
  • Typora无限续
  • [创业之路-438]:行业 - 互联网+X技术发展趋势、关键技术简介、行业发展趋势
  • 【第二章:机器学习与神经网络概述】03.类算法理论与实践-(2)朴素贝叶斯分类器
  • 【7】图像变换(上)
  • FPGA基础 -- Verilog 驱动强度(drive strength)与电荷强度(charge strength)
  • 黄晓明考博落榜,本人回应
  • react gsap动画库使用详解之scroll滑动动画
  • 2025年CSS最新高频面试题及核心解析
  • 16.数据聚合
  • LINUX 623 FTP回顾
  • 设计模式精讲 Day 12:代理模式(Proxy Pattern)
  • 手撕 Decoder
  • 将RESP.app的备份数据转码成AnotherRedisDesktopManager的格式
  • react gsap动画库使用详解之text文本动画
  • 山洪灾害智能监测站系统解决方案
  • 通过apache共享文件
  • 渗透测试指南(CSMSF):Windows 与 Linux 系统中的日志与文件痕迹清理
  • XSD是什么,与XML关系
  • D2554探鸽协议,sensor属性,回调