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

使用 Spring Boot 和 dynamic-datasource 实现多数据源集成

参考地址:

基础必读(免费) · dynamic-datasource · 看云

背景


在现代的微服务架构中,多数据源的使用场景越来越普遍。例如,一个系统可能需要同时访问多个数据库,或者在不同环境下切换数据源。Spring Boot 提供了强大的支持来简化多数据源的配置和管理。本文将介绍如何使用 Spring Boot 和 dynamic-datasource 库来实现多数据源的集成。


1. 为什么需要多数据源


多数据源的使用场景包括但不限于以下几种:
读写分离:通过主从数据库实现读写分离,提高系统的性能和可用性。
分库分表:在处理海量数据时,将数据分散到多个数据库中,以提高查询效率。
多租户架构:为不同的租户提供独立的数据存储,同时在逻辑上隔离数据。
动态切换数据源:根据不同的业务逻辑动态切换数据源,例如在不同环境下切换到不同的数据库。

2. 引入依赖


首先,我们需要在 Spring Boot 项目中引入 dynamic-datasource 的依赖。dynamic-datasource 是一个流行的开源库,用于动态切换数据源。

        <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.3.1</version></dependency>

3. 配置多数据源

application.yml 文件中配置多个数据源。以下是一个示例配置,包含三个数据源:masterslave_1 和 slave_2

spring:application:name: spring-boot-dynamic-datasourcetask:scheduling:pool:# 系统定时任务线程池,同时可以有N个定时任务可以同时执行。size: 2jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8main:allow-bean-definition-overriding: truedatasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为masterprimary: master# 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源strict: falsedatasource:master:url: jdbc:mysql://127.0.0.1:3306/xxxx2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverdruid:# 最大空闲连接数必须 ≥ minIdlemaxActive: 10# 最小空闲连接数(建议设为maxActive的1/6)minIdle: 2# 初始连接数建议与minIdle一致(原值3过低)initialSize: 2# 等待超时时间(合理)maxWait: 30000slave_1:url: jdbc:mysql://127.0.0.1:3306/xxxx2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverdruid:# 最大空闲连接数必须 ≥ minIdlemaxActive: 10# 最小空闲连接数(建议设为maxActive的1/6)minIdle: 2# 初始连接数建议与minIdle一致(原值3过低)initialSize: 2# 等待超时时间(合理)maxWait: 30000slave_2:url: jdbc:mysql://127.0.0.1:3306/xxxx3?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverdruid:# 最大空闲连接数必须 ≥ minIdlemaxActive: 10# 最小空闲连接数(建议设为maxActive的1/6)minIdle: 2# 初始连接数建议与minIdle一致(原值3过低)initialSize: 2# 等待超时时间(合理)maxWait: 30000

    4. 使用 @DS 切换数据源。

    /*** @DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。** 注解	结果* 没有@DS	默认数据源* @DS("dsName") dsName可以为组名也可以为具体某个库的名称* @Service* @DS("slave")*/
    public class UserServiceImpl implements UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public List selectAll() {return  jdbcTemplate.queryForList("select * from user");}@Override@DS("slave_1")public List selectByCondition() {return  jdbcTemplate.queryForList("select * from user where age >10");}
    }

    上面的不重要,直接从Gitee仓库拉下来具体项目.

    https://gitee.com/hanyunchuan/spring-boot-dynamic-datasource

    https://gitee.com/hanyunchuan/spring-boot-dynamic-datasource.git

    http://www.xdnf.cn/news/13836.html

    相关文章:

  1. 从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(1)
  2. 深入解析 SNMP Walk 的响应机制
  3. 智能疲劳驾驶检测系统算法设计与研究
  4. 山东大学软件学院项目实训:基于大模型的模拟面试系统项目总结(八)
  5. 微信小程序生成小程序码缓存删除
  6. 程序是怎么跑起来的第三章
  7. 产品成本分析怎么做?从0到1搭建全生命周期分析框架!
  8. 基于 Transformer RoBERTa的情感分类任务实践总结之四——PGM、EMA
  9. 操作系统导论 第42章 崩溃一致性:FSCK 和日志
  10. TEXT2SQL-vanna多表关联的实验
  11. 13.安卓逆向2-frida hook技术-HookJava构造方法
  12. 动态规划优雅计算比特位数:从0到n的二进制中1的个数
  13. FastJSON等工具序列化特殊字符时会加转义字符\
  14. 深度学习-163-MCP技术之使用Cherry Studio调用本地自定义mcp-server
  15. 门岗来访访客登记二维码制作,打印机打印粘贴轻松实现。
  16. 107.添加附件上传取消附件的功能
  17. 06_项目集成 Spring Actuator 并实现可视化页面
  18. 基于 8.6 万蛋白质结构数据,融合量子力学计算的机器学习方法挖掘 69 个全新氮-氧-硫键
  19. OrangePi 5 Max EMMC 系统烧录时下载成功,启动失败解决方案
  20. 高开放性具身智能AIBOX平台—专为高校实验室与科研项目打造的边缘计算基座(让高校和科研院所聚焦核心算法)
  21. 打卡第43天:Grad CAM与Hook函数
  22. 【ffmpeg】windows端安装ffmpeg
  23. ES集群的节点
  24. 深度学习入门(4):resnet50
  25. 今日行情明日机会——20250612
  26. Python小酷库系列:Python中的JSON工具库(1)
  27. 106.给AI回答添加点赞收藏功能
  28. PCI总线概述
  29. ubuntu22.04使用系统默认的中文输入法,打字只输入英文字符怎么操作才能打字中文
  30. 模型合并(model merge)