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

使用 dynamic-datasource-spring-boot-starter 实现多数据源动态切换

目录

在实际开发中,我们经常会遇到需要在一个项目中连接多个数据源的场景。例如,一个应用可能需要同时访问多个数据库,或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的轻量级多数据源动态切换工具,能够帮助我们轻松实现多数据源的管理和切换。 本文将详细介绍如何使用 dynamic-datasource-spring-boot-starter,包括使用方法、注意事项以及代码示例。

1. 引入依赖

2. 配置多数据源

3. 数据源切换

3.1 在方法级别切换数据源

3.2 在类级别切换数据源

4. 动态数据源原理

dynamic-datasource-spring-boot-starter 的核心原理是通过 AbstractRoutingDataSource 实现数据源的动态切换。它维护了一个线程本地变量(ThreadLocal),用于存储当前线程使用的数据源标识。@DS 注解会修改这个标识,从而在方法执行时切换到指定的数据源。

5. 事务管理

5.1 单数据源事务

5.2 多数据源事务

6. 高级功能

6.1 动态添加数据源

6.2 数据源健康检查

8. 总结

dynamic-datasource-spring-boot-starter 是一个功能强大且易于使用的多数据源管理工具。通过简单的配置和注解,我们可以轻松实现多数据源的动态切换和管理。本文详细介绍了其使用方法,并提供了代码示例,希望能帮助你在实际项目中更好地应用这一工具。 如果你有更多需求(如分布式事务、动态添加数据源等),可以参考官方文档或深入源码进行扩展。


在实际开发中,我们经常会遇到需要在一个项目中连接多个数据源的场景。例如,一个应用可能需要同时访问多个数据库,或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的轻量级多数据源动态切换工具,能够帮助我们轻松实现多数据源的管理和切换。 本文将详细介绍如何使用 dynamic-datasource-spring-boot-starter,包括使用方法、注意事项以及代码示例。

1. 引入依赖

首先,在 pom.xml 中引入 dynamic-datasource-spring-boot-starter 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version> //选择合适的版本
</dependency>

2. 配置多数据源

application.yml 中配置多个数据源。以下是一个示例配置:

spring:datasource:dynamic:primary: master # 默认数据源datasource:master:url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
  • primary:指定默认数据源。
  • datasource:定义多个数据源,每个数据源需要配置 urlusernamepassword 和 driver-class-name

3. 数据源切换

dynamic-datasource-spring-boot-starter 提供了 @DS 注解,用于在方法或类级别动态切换数据源。

3.1 在方法级别切换数据源

import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
public class UserService {@DS("master") // 使用 master 数据源public void addUser(User user) {// 插入用户数据}@DS("slave") // 使用 slave 数据源public User getUserById(Long id) {// 查询用户数据return userMapper.selectById(id);}
}

3.2 在类级别切换数据源

import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
@DS("slave") // 类级别指定默认数据源为 slave
public class OrderService {public Order getOrderById(Long id) {// 查询订单数据return orderMapper.selectById(id);}@DS("master") // 方法级别覆盖类级别的数据源public void addOrder(Order order) {// 插入订单数据}
}

4. 动态数据源原理

dynamic-datasource-spring-boot-starter 的核心原理是通过 AbstractRoutingDataSource 实现数据源的动态切换。它维护了一个线程本地变量(ThreadLocal),用于存储当前线程使用的数据源标识。@DS 注解会修改这个标识,从而在方法执行时切换到指定的数据源。

5. 事务管理

在多数据源场景下,事务管理需要特别注意。默认情况下,Spring 的事务管理器只能管理一个数据源。如果需要跨数据源事务,可以使用分布式事务解决方案(如 Seata)。

5.1 单数据源事务

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {@Transactional // 默认使用主数据源public void addUser(User user) {userMapper.insert(user);}
}

5.2 多数据源事务

如果需要跨数据源事务,可以使用 @DSTransactional 注解:

import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import org.springframework.stereotype.Service;
@Service
public class OrderService {@DSTransactional // 支持多数据源事务public void placeOrder(Order order, User user) {userMapper.insert(user); // 使用 master 数据源orderMapper.insert(order); // 使用 slave 数据源}
}

6. 高级功能

6.1 动态添加数据源

在某些场景下,可能需要动态添加数据源。可以通过 DynamicDataSourceCreator 实现:

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DataSourceService {@Autowiredprivate DynamicDataSourceCreator dataSourceCreator;public void addDataSource(String name, String url, String username, String password) {DataSourceProperty property = new DataSourceProperty();property.setUrl(url);property.setUsername(username);property.setPassword(password);property.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSourceCreator.createDataSource(property, name);}
}

6.2 数据源健康检查

可以通过 DataSourceHealthIndicator 检查数据源的健康状态:

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceHealthIndicator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HealthCheckService {@Autowiredprivate DataSourceHealthIndicator healthIndicator;public boolean checkDataSourceHealth(String name) {return healthIndicator.health(name).getStatus().isUp();}
}

8. 总结

dynamic-datasource-spring-boot-starter 是一个功能强大且易于使用的多数据源管理工具。通过简单的配置和注解,我们可以轻松实现多数据源的动态切换和管理。本文详细介绍了其使用方法,并提供了代码示例,希望能帮助你在实际项目中更好地应用这一工具。 如果你有更多需求(如分布式事务、动态添加数据源等),可以参考官方文档或深入源码进行扩展。

参考文档

  • dynamic-datasource-spring-boot-starter GitHub
  • Spring Boot 官方文档
  • MyBatis 官方文档

相关文章:

使用 dynamic-datasource-spring-boot-starter 实现多数据源动态切换

目录 在实际开发中&#xff0c;我们经常会遇到需要在一个项目中连接多个数据源的场景。例如&#xff0c;一个应用可能需要同时访问多个数据库&#xff0c;或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的轻量级多数据源动态…...

springboot中注解有什么用

注解&#xff08;Annotation&#xff09;是 Java 的一个重要特性&#xff0c;我用几个具体例子来解释&#xff1a; 1、标记功能 Service // 告诉Spring这是一个服务类 public class UserService { }Data // 告诉Lombok自动生成getter/setter public class User {private…...

Spring Boot 缓存最佳实践:从基础到生产的完整指南

Spring Boot 缓存最佳实践&#xff1a;从基础到生产的完整指南 引言 在现代分布式系统中&#xff0c;缓存是提升系统性能的银弹。Spring Boot 通过 spring-boot-starter-cache​ 模块提供了开箱即用的缓存抽象&#xff0c;但如何根据业务需求实现灵活、可靠的缓存方案&#xf…...

Linux网络相关内容与端口

网络相关命令 ping命令测试连接状态 wget命令&#xff1a;非交互式文件下载器&#xff0c;可以在命令行内下载网络文件 使用ctrlc可以中止下载 curl命令&#xff1a;可以发送http网络请求&#xff0c;用于文件下载、获取信息等 其实和浏览器打开网站一样&#xff0c;cu…...

Python Flask框架学习汇编

1、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【附例子】》 讲解的特别清楚&#xff0c;每一步都…...

GitHub CI流水线

GitHub CI流水线 build.yml 路径&#xff1a;.github/workflows/build.yml name: Docker Image CIon:workflow_dispatch:jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkoutv4- name: Set up JDK 8uses: actions/setup-javav4with:java-version: 8distributi…...

机器视觉运动控制一体机在天地盖同步跟随贴合解决方案

市场应用背景 纸盒天地盖是一种包装形式&#xff0c;广泛应用于消费电子、食品礼盒、奢侈品及化妆品等领域。其采用高强度纸板&#xff0c;经过预组装处理&#xff0c;结构坚固稳定&#xff0c;能有效保护产品并提升品牌形象。随着包装行业快速发展&#xff0c;市场对天地盖的…...

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

什么是全栈?

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 &#x1f4c3;文章前言 &#x1f537;文章均为学习工…...

后端-Java虚拟机

Java虚拟机 Java虚拟机的组成 Java虚拟机的组成由类加载器ClassLoader、运行时数据区域&#xff08;JVM管理的内存&#xff09;和执行引擎&#xff08;即时遍历器、解释器垃圾回收器&#xff09; 类加载器加载class字节码文件中的内容到内存运行时数据区域负责管理jvm使用到…...

Android 低功率蓝牙之BluetoothGattCallback回调方法详解

BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗&#xff08;BLE&#xff09;设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析&#xff1a; 1. onConnectionStateChange 触发时机&am…...

K8S学习之基础十四:k8s中Deployment控制器概述

Deployment控制器概述&#xff1a; Deployment控制器是k8s中最常用的资源对象&#xff0c;为Replicaset和Pod创建提供了一种声明式的定义方法&#xff0c;在Deployment对象中描述一个期望的状态&#xff0c;Deployment控制器就会按照一定的控制速率把实际状态改成期望状态&…...

Vue3快速入门笔记

目录 1.Vue3简介1.1.性能提升1.2.源码升级1.3.拥抱TypeScript1.4.新特性 2.创建Vue3工程2.1.基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;2.3.代码运行 3.Vue3核心语法3.1.OptionsAPI(选项式API) 与 CompositionAPI(组合式API)3.2.setup3.3.ref 创建&…...

【LeetCode104】二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路与算法 树的最大深度可以通过其左子树和右子树的最大深度来定义。对于给定节点&#xff0c;最大深度为 1&#xff08;当前节点&#xff0…...

SQLAlchemy系列教程:理解SQLAlchemy元数据

SQLAlchemy是Python开发人员的强大ORM工具。SQLAlchemy中的元数据是对象-关系映射配置的集合&#xff0c;允许开发人员无缝地定义和使用数据库模式。 使用元数据 SQLAlchemy中的元数据充当各种数据库描述符&#xff08;如表、列和索引&#xff09;的容器。这使开发人员能够通…...

Apache Shiro 反序列化漏洞全解析(Shiro-550 Shiro-721)

一、前言 Apache Shiro 是一个强大的 Java 安全框架&#xff0c;广泛用于用户认证、授权、加密和会话管理。然而&#xff0c;由于 Shiro 在某些版本中存在反序列化漏洞&#xff0c;攻击者可以通过特定手法实现远程代码执行&#xff08;RCE&#xff09;&#xff0c;进而获取服务…...

计算机毕业设计Python+DeepSeek-R1大模型空气质量预测分析(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

实例详细演示在Pytest中如何忽略警告

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 当你尝试运行Pytest代码时&#xff0c;那些不相关的警告突然弹出&#xff0c;是不是…...

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...

mysql进阶(三)

MySQL架构和存储引擎 1. MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器 的连接器。整体架构图如下所⽰&#xff1a; 2. 连接层 …...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...