Spring Boot多数据源配置详解

Spring Boot多数据源配置详解

在实际企业开发中,随着业务复杂度提升,单一数据源已无法满足所有场景需求。比如:读写分离、分库分表、数据迁移、微服务整合等,这时就需要用到多数据源配置。本文将从原理、配置、常见问题和最佳实践等方面,带你全面掌握Spring Boot多数据源的实现方式。

一、为什么要用多数据源?

  1. 读写分离:主库写、从库读,提升性能与可用性。
  2. 多业务数据库:不同业务模块独立数据库,降低耦合。
  3. 数据迁移/整合:新旧系统并行,数据同步。
  4. 多租户/分库分表:按租户或业务分库,提升扩展性。

二、Spring Boot多数据源实现原理

Spring Boot默认只配置一个DataSource,多数据源本质上是注册多个DataSource Bean,并通过@Primary@Qualifier等注解区分。每个数据源对应自己的JdbcTemplateTransactionManagerMyBatisJPA配置。

三、实战:Spring Boot多数据源配置

1. 添加依赖

以MySQL和MyBatis为例:

<!-- pom.xml -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version>
</dependency>

2. 配置多数据源

# 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

3. 编写数据源配置类

@Configuration
@MapperScan(basePackages = "com.example.mapper.db1", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "primaryTransactionManager")public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "primarySqlSessionTemplate")public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}
@Configuration
@MapperScan(basePackages = "com.example.mapper.db2", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondarySqlSessionFactory")public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "secondaryTransactionManager")public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "secondarySqlSessionTemplate")public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

4. 使用多数据源

只需将不同的Mapper接口分别放在com.example.mapper.db1com.example.mapper.db2包下,Spring Boot会自动注入对应的数据源。

四、常见问题与解决方案

  1. 事务管理混乱
    每个数据源要有独立的TransactionManager,并用@Transactional(transactionManager = "xxxTransactionManager")指定。

  2. Mapper扫描冲突
    @MapperScan要指定basePackagessqlSessionTemplateRef,避免扫描到错误的数据源。

  3. JPA多数据源
    JPA配置类似,但需额外配置EntityManagerFactoryPlatformTransactionManager

五、最佳实践

  • 命名规范:Bean、包名、配置前缀要清晰区分。
  • 配置解耦:推荐用@ConfigurationProperties集中管理数据源配置。
  • 动态数据源:如需动态切换,可用AbstractRoutingDataSource或开源组件(如druid、dynamic-datasource)。
  • 安全性:敏感信息建议用加密或环境变量管理。

六、总结

Spring Boot多数据源配置并不复杂,关键在于理解原理、规范配置、合理分包。掌握多数据源技术,不仅能提升系统扩展性和灵活性,也是后端开发进阶的必备技能。


如果你觉得本文有帮助,欢迎点赞、关注、转发!如有疑问,欢迎留言交流。


如需Word版或代码示例工程,请留言获取!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88173.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目进度严重依赖关键人,如何分散风险

项目进度严重依赖关键人的风险&#xff0c;可以通过建立知识共享机制、强化团队协作模式、实施交叉培训和培养后备人才、优化流程标准化等措施有效分散。其中&#xff0c;实施交叉培训和培养后备人才尤为重要&#xff0c;通过培养多个成员具备相似的关键技能&#xff0c;能够迅…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com)1.实验简介实验目的&#xff1a;完成 DDR3 的读写测试。实验环境&#xff1a;Window11 PDS2022.2-SP6.4芯片型号&#x…

《每日AI-人工智能-编程日报》--2025年7月9日

介绍:AI 方面1. Manus 通用智能体初成型&#xff0c;开启 AIAgent 新时代​中泰证券发布研报称&#xff0c;首款通用型 AI 智能体 Manus 已问世&#xff0c;能够将复杂任务拆解为可执行的步骤链&#xff0c;并在虚拟环境中灵活调用工具&#xff0c;标志着 AI 从 “Reasoner” 走…

MyBatis之数据操作增删改查基础全解

目录 1. ➕MyBatis添加数据 1.1. 持久层接口添加方法 1.2. 映射文件添加标签 1.3. 编写测试方法 2. ✏️MyBatis修改数据 2.1. 代码的优化 2.2. 持久层接口添加方法 2.3. 映射文件添加标签 2.4. 编写测试方法 3. &#x1f5d1;️MyBatis删除数据与根据Id查询 3.1. 删…

kbmMemTable Pro 7.82 Delphi 11 源代码

kbmMemTable Pro 7.82 Delphi 11 源代码KbmMemTable 是一个用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 应用程序中存储临时数据的组件&#xff0c;这些应用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等编程语言创建&#xff0c;同时您还可以高速访问存储在数据…

LeetCode Hot 100 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法&#xff0c;且在 O(n) 时间复杂度内…

VC Code--常用的配置

原文网址&#xff1a;VC Code--常用的配置-CSDN博客 简介 本文介绍VC Cod常用的配置。 1.字体大小 整体字体大小 左下角齿轮> Settings> Windows> Window: Zoom Level> 改为&#xff1a;2 编辑器字体大小&#xff08;如果调整了整体字体大小&#xff0c;此处…

大模型驱动的智能体:从GPT-4到o1的能力跃升

大模型驱动的智能体&#xff1a;从GPT-4到o1的能力跃升 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之间的关系

1. Transformer架构的两大方向 Transformer分为两大类应用&#xff0c;但划分标准不是"分类vs生成"&#xff0c;而是编码方式&#xff1a; Encoder架构&#xff08;代表&#xff1a;BERT&#xff09;&#xff1a; 使用Transformer的​​编码器​​&#xff08;Encode…

ARM汇编编程(AArch64架构)课程 - 第7章:SIMD与浮点运算

目录1. NEON寄存器关键特性数据排列示例2. 浮点指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架构提供32个128位NEON向量寄存器&#xff08;V0-V31&#xff09;&#xff0c;支持SIMD并行计算 关键特性 寄存器类型数量位宽数据视图Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型详解:CBOW与Skip-gram

Word2Vec模型详解&#xff1a;CBOW与Skip-gram 目录 模型概述理论基础CBOW模型详解Skip-gram模型详解模型对比代码实现详解训练过程分析应用场景实验结果总结 模型概述 Word2Vec是一种用于生成词向量的神经网络模型&#xff0c;由Google在2013年提出。它包含两种主要架构&am…

跨服务sqlplus连接oracle数据库

背景&#xff1a;ogg程序同步数据。 目标库&#xff1a;客户oracle数据库11.0.2.4.0&#xff0c;也就是11g的数据库。源库&#xff1a;业务组搭建的19c数据库&#xff0c;刚安装的oracle数据库。ogg在源库和目标库系统都部署好了并且也可以通信。在目标库系统使用sqlplus测试连…

虚拟机安装与使用vim编辑器简单使用

文章目录1.VMware17许可证2.ubuntu虚拟机的显示屏幕太小3.vmware 17 无法安装 vmware tools4.buntu常用快捷键与命令5.vim文本编辑器参考资料&#xff1a;1.VMware17许可证 JU090-6039P-08409-8J0QH-2YR7F&#xff08;亲测2025/7/8有效&#xff09; 2.ubuntu虚拟机的显示屏幕…

Tomcat:启用https(Windows)

1、在D盘cmd&#xff0c;使用keytool生成签名&#xff08;365天&#xff09;&#xff08;密码111111&#xff09;&#xff1a; keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 2、在conf/server.xml中添加如下配置&#xff0…

A模块 系统与网络安全 第四门课 弹性交换网络-2

今日目标 STP协议概述STP工作原理选举根端口和指定端口BPDUMSTP工作原理及配置MSTP负载均衡1 STP协议概述 1.1 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题&#xff0c;PC之间都会无法通信解决方案 提高网络可靠性 增加冗余/备份链路产生新的问题 增…

人工智能-基础篇-20-如何搭建一个人工智能知识库?

1、前期准备阶段 1、明确目标与范围 目标&#xff1a;确定知识库的核心用途&#xff08;如内部文档共享、客户服务支持、培训材料存储等&#xff09;。明确预期用户群体及其需求。范围&#xff1a;明确覆盖部门&#xff08;如技术部、销售部&#xff09;、知识类型&#xff08;…

存储延时数据,帮你选数据库和缓存架构

1. 理解存储媒介量化延时类别描述延时缓存/内存L1 cache reference1 ns缓存/内存L2 cache reference4 ns缓存/内存Main memory reference&#xff08;DDR4&#xff0c;5 - 10 ns 为补充说明 &#xff09;100 ns网络传输Send packet CA->Netherlands->CA150,000,000 ns&am…

人工智能领域的顶会

人工智能领域的顶会&#xff08;顶级学术会议&#xff09;通常按研究方向划分&#xff0c;涵盖机器学习、计算机视觉、自然语言处理、机器人学等多个子领域。这些会议以录用标准严格、学术影响力高著称&#xff0c;是全球AI研究者交流前沿成果的核心平台。这些顶会的录用论文通…

kotlin+MongoTemplate的时间类型为is_date类型 pymongo如何处理

来自AI回答 在 Kotlin 中使用 MongoTemplate&#xff08;来自 Spring Data MongoDB&#xff09;时&#xff0c;配置方式和 Java 是一致的&#xff0c;主要通过 MongoClientSettings、MongoTemplate Bean、以及 application.yml 配置完成。 ✅ 一、MongoTemplate 的配置方式 你可…