【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源
一、 业务场景解释
由于公司业务需要开发设计一款文件读取导入工具,导入的配置和目标数据库并不一定在同一个数据库地址,故需要使用到自定义数据源,并且支持数据源切换
大致场景如下:

二、工具选择
鉴于市面上有很多工具,具体查找资料时也看的了很多,比如比较原生的druid驱动切换写法等等,而公司目前架构中有一个工具引起了我的注意:
苞米豆的“dynamic-datasource-spring-boot-starter”
官方文档地址:https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
多数据源切换的原理教学:https://www.bilibili.com/video/BV11Z4y1f7cT/
关于基础的dynamic-datasource-spring-boot-starter就不做介绍了,官方文档讲的很清楚
三、代码实例
3.1 导入依赖
<!--多数据源-->
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.2.0</version>
</dependency>
关于版本的选择:
| dynamic-datasource | jdk | springboot | gravvel | druid |
|---|---|---|---|---|
| 3.5.2 | jdk1.7+ | 1.5.x和2.x.x和3.x.x | 不支持 | 不支持1.2.17引入的socketTimeout和connectTimeout |
| 4.1.3 | jdk1.7+ | 1.5.x和2.x.x和3.x.x | 不支持 | 都支持 |
| >=4.2.0 | jdk1.8+ | 1.5.x和2.x.x和3.x.x | 支持 | 都支持 |
目前自己的项目是springboot2.5.2 jdk1.8,配合4.20版本是兼容可用的
3.2 示例
package com.zhc.dynamic;import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.*;
import com.baomidou.dynamic.datasource.creator.basic.BasicDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.beecp.BeeCpDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.dbcp.Dbcp2DataSourceCreator;
import com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.hikaricp.HikariDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.jndi.JndiDataSourceCreator;
import com.zhc.domain.DataSourceDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.sql.DataSource;
import java.util.Set;@RestController
@RequestMapping("/datasources")
public class DataSourceController {@Autowiredprivate DataSource dataSource;// private final DataSourceCreator dataSourceCreator; //3.3.1及以下版本使用这个通用,强烈推荐sb2用户至少升级到3.5.2版本@Autowiredprivate DefaultDataSourceCreator dataSourceCreator;//如果是用4.x以上版本,因为要和spring解绑,重构了一些东西,比如缺少了懒启动和启动初始化数据库。不太建议用以下独立的创建器,只建议用上面的DefaultDataSourceCreator@GetMapping// ("获取当前所有数据源")public Set<String> now() {DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;return ds.getDataSources().keySet();}//通用数据源会根据maven中配置的连接池根据顺序依次选择。//默认的顺序为druid>hikaricp>beecp>dbcp>spring basic@PostMapping("/add")// ("通用添加数据源(推荐)")public Set<String> add(@Validated @RequestBody DataSourceDTO dto) {DataSourceProperty dataSourceProperty = new DataSourceProperty();BeanUtils.copyProperties(dto, dataSourceProperty);DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);ds.addDataSource(dto.getPoolName(), dataSource);return ds.getDataSources().keySet();}@DeleteMapping// ("删除数据源")public String remove(String name) {DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;ds.removeDataSource(name);return "删除成功";}
}
以上示例提供了用户通过接口对数据源进行增删查。
package com.zhc.domain;import lombok.Data;@Data
public class DataSourceDTO {/*** 连接池名称*/private String poolName;/*** JDBC driver org.h2.Driver*/private String driverClassName;/*** JDBC url 地址*/private String url;/*** JDBC 用户名*/private String username;/*** JDBC 密码*/private String password;
}
3.3 git地址
https://gitee.com/zhc-gitee/dynamic-datasource-springboot-demo
相关文章:
【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源
一、 业务场景解释 由于公司业务需要开发设计一款文件读取导入工具,导入的配置和目标数据库并不一定在同一个数据库地址,故需要使用到自定义数据源,并且支持数据源切换 大致场景如下: 二、工具选择 鉴于市面上有很多工具&#…...
制作docker镜像文件
技术主题 Docker作为一个开源的应用容器引擎,制作自己的docker镜像文件是使用docker的第一步,这样我们能够更好地管理应用程序。 技术原理 技术原理一:安装Docker 一般都是在官网下载特定的docker文件,然后安装即可 技术原理…...
JAVA 中 Socket 和 WebSocket 区别
区别: Socket: Socket是位于java.net包下的一个类,是 Java 提供的用于在客户端和服务器之间建立网络通信的底层套接字接口,用于传输层的网络通信。 WebSocket: WebSocket 是一种基于 TCP 协议的通信协议,建立在 Socket 的基础上,…...
python 接收到一个接口的数据 是json格式 ,然后把其中键值对的一个值改掉 再返回给接口
先上代码 import json import requests # 发送请求获取接口数据 response requests.get(http://example.com/api/data) # 解析JSON数据 data json.loads(response.text) # 更改某个键值对的值 new_value new_value data[key_to_change] new_value # 将更改后…...
⌈C++11⌋实现一个简易计算器
原理: 数据栈:有数据就直接入栈 运算符栈:设遍历到当前的运算符位e,如果栈不为空,比较栈顶与当前运算符优先级e,当栈顶运算符优先级大于或者等于e的优先级,则出栈,并将两个数据栈的…...
面试算法45:二叉树最低层最左边的值
题目 如何在一棵二叉树中找出它最低层最左边节点的值?假设二叉树中最少有一个节点。例如,在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时,每当遇到新…...
Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21.
前两天下了一个demo,运行时候报了一个这样的错,特此记录一下。 先看下报的错。 Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21. Searched in the following…...
LoRaWan之LoRaMAC 的快速入门指南
概述 本快速入门指南简要介绍了 LoRaMAC 层的重要操作。示例部分提供了不同设备类别的完整示例。 初始化 LoRaMAC层的初始化函数是LoRaMacInitialization( LoRaMacPrimitives_t *primitives, LoRaMacCallback_t *callbacks, LoRaMacRegion_t region )。该函数具有三个参数:L…...
中国教育企业出海 新兴技术助力抢占先机
继游戏、电商、短视频等领域轮番出海之后,国内教育企业纷纷开启了出海之路。近日发布的《2023年教育应用出海市场洞察》报告显示,在中国教育企业出海市场中,语言学习是最主要的赛道,但赛道竞争更为激烈。 报告指出,全…...
IntelliJ IDEA2023旗舰版和社区版下载安装教程(图解)
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
【RxJava】map过程中各个Observable生命周期分析
map和flatMap的区别 首先说下map和flatMap的区别,防止有对RxJava还不够熟悉的小伙伴 map的Function指定如何将A转为BflatMap的Function则指定如何将Observable<A>转为Observable<B>map和flatMap最终的转换结果都是Observable<B>flatMap由于可以…...
vue 获取上一周和获取下一周的日期时间
效果图: 代码 <template><div><div style"padding: 20px 0;"><div style"margin-left: 10px; border-left: 5px solid #0079fe; font-size: 22px; font-weight: 600; padding-left: 10px">工作计划</div><di…...
线性代数 第四章 线性方程组
一、矩阵形式 经过初等行变换化为阶梯形矩阵。当,有解;当,有非零解。 有解,等价于 可由线性表示 克拉默法则:非齐次线性方程组中,系数行列式,则方程组有唯一解,且唯一解为 其中是…...
@DateTimeFormat和@JsonFormat注解
在日常开发中,有用到时间类型作为查询参数或者查询结果有时间参数的一般都会见过这两个注解。 DateTimeFormat(pattern “yyyy-MM-dd HH:mm:ss”)注解用于解析请求接口入参。将入参的字符串按照pattern设置的格式来转换成日期时间对象。 JsonFormat(timezone “G…...
做抖音短视频会经历哪些阶段?
今天来聊聊那些在抖音做大的老板,从开始到后期经历的四个阶段,以及每个阶段的工作重心 1、0—1的阶段 0—1的起步阶段是整个阶段最有难度的一环,很多人对0到1的认知是有错误的,以为爆过几条视频就已经进阶了 想要实现0-1的突破…...
【Mquant】2、量化平台的选择
文章目录 一、选择因素二、常见的量化平台三、为什么选择VeighNa?四、参考 一、选择因素 功能和工具集:量化平台应该提供丰富的功能和工具集,包括数据分析、策略回测、实时交易等。不同的平台可能有不同的特点和优势,可以根据自己…...
iPhone手机如何恢复删除的视频?整理了3个好用方法!
在日常生活中,我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴,每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办?如何恢复删除的视频?本文将以iPhone手机为例子,教…...
全网最全的RDMA拥塞控制入门基础教程
RDMA-CC(全网最全的RDMA拥塞控制入门基础教程) 文章目录 RDMA-CC(全网最全的RDMA拥塞控制入门基础教程)DMARDMARDMA举例RDMA优势RDMA的硬件实现方法RDMA基本术语FabricCA(Channel Adapter)Verbs 核心概念Me…...
分布式消息队列:RabbitMQ(1)
目录 一:中间件 二:分布式消息队列 2.1:是消息队列 2.1.1:消息队列的优势 2.1.1.1:异步处理化 2.1.1.2:削峰填谷 2.2:分布式消息队列 2.2.1:分布式消息队列的优势 2.2.1.1:数据的持久化 2.2.1.2:可扩展性 2.2.1.3:应用解耦 2.2.1.4:发送订阅 2.2.2:分布式消息队列…...
Redis集群脑裂
1. 概述 Redis 集群脑裂(Cluster Split Brain)是指在 Redis 集群中,由于网络分区或通信问题,导致集群中的节点无法相互通信,最终导致集群内部发生分裂,出现多个子集群,每个子集群认为自己是有效…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
