【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源

一、 业务场景解释

由于公司业务需要开发设计一款文件读取导入工具,导入的配置和目标数据库并不一定在同一个数据库地址,故需要使用到自定义数据源,并且支持数据源切换

大致场景如下:

image-20231101094735988

二、工具选择

鉴于市面上有很多工具,具体查找资料时也看的了很多,比如比较原生的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-datasourcejdkspringbootgravveldruid
3.5.2jdk1.7+1.5.x和2.x.x和3.x.x不支持不支持1.2.17引入的socketTimeout和connectTimeout
4.1.3jdk1.7+1.5.x和2.x.x和3.x.x不支持都支持
>=4.2.0jdk1.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

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

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

相关文章

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表里…

路径复杂度(环形回路的复杂度计算)

路径复杂度 1、通用公式: (EF) - N12、非环形回路的复杂度计算公式为什么1&#xff1f;公式为什么(EF)-N&#xff1f; 3、类推到环形回路的复杂度演示区分下纯环形回路 和 不是纯粹的环形回路 3、特殊情况&#xff1a;自旋公式化理解&#xff1a;此时将B自旋回路看成一个环形回…

Mentor PADS BOM物料清单的创建方法教程

BOM表即物料清单。当原理图设计完成之后&#xff0c;就可以开始整理物料清单准备采购元件了。如何将设计中用到的元件的信息吗进行输出以方便采购呢&#xff1f;这个时候就会用到BOM表了。 1、执行菜单命令“文件”→“报告”&#xff0c;进入“报告”对话框&#xff0c;在“选…

聊聊无源滤波器与有源滤波器的概念、区别与应用

随着电子技术的迅速发展&#xff0c;电子设备得到广泛的应用&#xff0c;然而电磁环境污染日趋严重&#xff0c;已成为当今主要公害之一。在很多领域里&#xff0c;电磁兼容性已成为电气和电子产品必须有的技术指标或性能评价的依据&#xff0c;通过使用电源滤波器来过滤掉电源…

【C# Programming】委托和lambda表达式、事件

目录 一、委托和lambda表达式 1.1 委托概述 1.2 委托类型的声明 1.3 委托的实例化 1.4 委托的内部机制 1.5 Lambda 表达式 1.6 语句lambda 1.7 表达式lambda 1.8 Lambda表达式 1.9 通用的委托 1.10 委托没有结构相等性 1.11 Lambda表达式和匿名方法的内部机制 1.1…

零代码编程:用ChatGPT进行批量重命名时需要注意特殊字符

用ChatGPT进行批量重命名时&#xff0c;一部分成功了&#xff0c;但有一部分文件标题没有变化。 问下ChatGPT怎么回事&#xff1a; 回复&#xff1a;在Windows中&#xff0c;文件名不能包含以下字符&#xff1a;\ / : * ? " < > |&#xff0c;使用Python的 str.rep…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块&#xff08;Sensorless Remote Assistant Module&#xff0c;以下简称SRA模块&#xff09;。SRA模块是一款支…

【Java】LinkedList 集合

LinkedList集合特点 LinkedList 底层基于双向链表实现增删 效率非常高&#xff0c;查询效率非常低。 LinkedList源码解读分析 LinkedList 是双向链表实现的 ListLinkedList 是非线程安全的&#xff08;线程是不安全的&#xff09;LinkedList 元素允许为null,允许重复元素Linked…

跨境电商的新引擎:崛起的网红经济

随着全球数字化时代的崛起&#xff0c;跨境电商成为了国际贸易的新引擎&#xff0c;而在这个巨大的变革浪潮中&#xff0c;网红经济正在崭露头角&#xff0c;成为这一引擎的有力推动者。在这篇文章中&#xff0c;我们将深入探讨网红经济如何催生跨境电商的新动力&#xff0c;以…

蓝桥杯每日一题2023.10.31

题目描述 全球变暖 - 蓝桥云课 (lanqiao.cn) 题目分析 果然有关连通块类的问题使用dfs都较为好写~~ 我们可以通过判断连通块的代码来加上部分条件算出被完全淹没的岛屿个数 在岛屿中如果有为"#"的a[i][j]上下左右全部是"#"则说明此岛屿一定不会被完全…

IDEA在service面板中不显示微服务的项目

在.idea文件夹下的workspace文件中的project标签内添加如下代码段&#xff0c;&#xff0c;重启idea即可看到所有服务出现在了service面板中 <component name"RunDashboard"><option name"configurationTypes"><set><option value&q…

Debug技巧-不启用前端访问后端

在日常开发中&#xff0c;我们经常会遇到各种问题需要调试&#xff0c;前后端都启动需要耗费一定的时间和内存&#xff0c;方便起见&#xff0c;可以直接用抓包数据访问后端&#xff0c;这里我们需要用到Postman或者ApiFox 抓包数据 在系统前台触发后端请求&#xff0c;在控制…