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

news2025/7/21 5:27:09

一、 业务场景解释

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

大致场景如下:

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 {

    @Autowired
    private DataSource dataSource;
    // private final DataSourceCreator dataSourceCreator; //3.3.1及以下版本使用这个通用,强烈推荐sb2用户至少升级到3.5.2版本

    @Autowired
    private 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.coloradmin.cn/o/1157229.html

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

相关文章

Leetcode刷题详解——计算布尔二叉树的值

1. 题目链接&#xff1a;2331. 计算布尔二叉树的值 2. 题目描述&#xff1a; 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示 True 。非叶子节点 要么值为 2 要么值为 …

【进程】利用 Linux 下的 /proc/pid/ 的内容学习进程

1. 进程号 在计算机中&#xff0c;每一个进程都有一个进程号&#xff0c;进程号类似于一个索引&#xff0c;操作系统就是通过这个进程号快速地找到进程。在 linux 使用 ps -aux 查看进程&#xff0c;可以看到进程号pid&#xff1a; rootswd-Lenovo-G40-80:/proc/4234# ps -au…

建站起步-如何选择域名

如何选择合适的域名 如何选择合适的域名 我们所看到的网站是由域名加空间服务器加网站程序组成的,往往我们用户最先看到的就是网站的域名,因为网站内容加载往往需要时间,所以最先展示的就是我们网站的域名了。域名就跟我们手机号一样具有唯一性,当我们没有及时续费时,就…

LibTorch实战三:C++版本YOLOV5.4的部署

目录 一、环境配置 二、.torchscript.pt版本模型导出 三、C版本yolov5.4实现 四、问题记录 4.1、注释 detector.h中&#xff0c;注释如下头文件 4.2、错误&#xff1a; “std”: 不明确的符号 4.3、建议常被debug版本libtorch 4.4、问题&#xff1a;编译成功后&#xff…

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Ardupilot开源飞控之Wiki修改操作

Ardupilot开源飞控之Wiki修改操作 1. 源由2. 页面编辑修改2.1 Step 1: 申请Github账号2.2 Step 2: 选择修改页面2.3 Step 3: 修改页面内容2.4 Step 4: 提交修改2.5 Step 5: 新增PR 3. 增删页面修改3.1 Step 1: 克隆本地的Ardupilot Wiki3.2 Step 2: 搭建本地验证环境3.3 Step 3…

【Android知识笔记】换肤专题

换肤其实也属于插件化专题的一个子话题,之所以单独拿出来,是因为它的处理方式比较特殊,相比插件化而言较简单一些。 系统内置的换肤功能支持 - Theme Android 系统中如果想修改应用的背景色,最简单的就是利用以下Theme相关的属性: 使用这些内置的属性可以实现一定程度上…

SAP-MM-查找物料修改记录

业务场景&#xff1a; 仓管员修改了物料描述&#xff0c;研发部想要查哪些被修改了&#xff0c; 底表:CDHDR、CHPOS 首先在底表CDHDR中查找用户名的操作记录&#xff0c; 输入修改代码、时间范围、用户名 执行&#xff0c;生产数据 导出数据&#xff0c;复制文档编号&#…

身份证OCR:变革的触手,掀起识别的革命

身份证OCR识别技术&#xff08;Optical Character Recognition&#xff09;是一项将身份证上的文字信息转化为可编辑、搜索、存储、分享的电子文本的技术。它的发展与信息技术和身份认证需求的不断演进密切相关。以下将简要介绍身份证OCR识别技术的历史以及兴起背景。 OCR识别…

Windows个性化颜色睡眠后经常改变

问题再现 我把系统颜色换成了一种红色&#xff0c;结果每次再打开电脑又变回去了&#xff08;绿色&#xff09;&#xff1b; 原因是因为wallpaper engine在捣蛋 需要禁用修改windows配色这一块选项&#xff1b; 完事&#xff01;原来是wallpaper engine的问题&#xff1b;

什么是Webpack的loader和plugin?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

这个电力问题难倒90%的人,但我只用一招就搞定!

随着现代社会对电力需求的不断增加&#xff0c;配电系统的可靠性和安全性变得至关重要。为了确保电力系统的稳定运行&#xff0c;配电柜监控系统应运而生。 配电柜监控系统通过实时监测和控制电力分配&#xff0c;提供了对电力系统状态的详细洞察&#xff0c;以帮助运维人员及时…

不同阶段品牌的种草策略是什么,小红书打法分析!

不同阶段的品牌在制定营销目标&#xff0c;规划营销策略&#xff0c;执行营销方案时的操作&#xff0c;也有所不同。所以&#xff0c;今天我们以品牌的发展阶段为基准&#xff0c;与大家探讨一下&#xff0c;不同阶段品牌的种草策略是什么&#xff0c;小红书打法分析&#xff0…

[UDS] --- TesterPresent 0x3E

1 0x3E功能描述 这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态&#xff0c;可以保持当前的非默认&#xff08;Default Session&#xff09;会话&#xff0c;通过周期地发送请求帧来阻止自动跳转回默认&#xff08;Default Session&#xff09;会话。 2 0x…

写博客的模板

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

Scan2BIM实战:从3D扫描到BIM模型生成

最近&#xff0c;我被问过很多次这个问题&#xff0c;所以我想我会尽力传达答案。 我应该指出&#xff0c;以下是概述&#xff0c;而不是非常详细的分步过程。 有很多因素会决定这项工作&#xff1b; 详细程度、扫描设备、点云配准软件和 CAD 软件等。 由于不知道你可能拥有或感…

电池内阻仪原理分析

前言 整理电脑看到一个名为“内阻仪”的文档&#xff0c;打开看了一下&#xff0c;记录一下&#xff1b; 前置知识 测内阻就是测电阻&#xff0c;核心原理&#xff1a;RU/I&#xff1b; U&#xff1a;这里面是交流激励信号&#xff1b; I&#xff1a;这里是恒流激励 电路与…

redirect_uri 参数错误

当微信登陆报redirect_uri 参数错误&#xff0c;网上很多人说是域名配置有问题&#xff0c;我在检查过后没发现这个有什么问题&#xff0c;然后我在redirect_uri的授权回调域 前面加上https://就好了 appid"appid" :scope"snsapi_login" :theme&quo…

YNS2582 同步升压双节锂电池充电管理 IC

YNS2582 同步升压双节锂电池充电管理 IC 简述&#xff1a; NS2582 是一款支持输入电压 4-5.5VIN&#xff0c;输出最大 2A 电流的同步升压式双节锂电池充电器。其集成了极低的导通电阻 FETs&#xff0c;以实现较高的充电效率和极少数外围器件。NS2582 内置了 1.2MHz 开关频率和…

外汇天眼:10月客诉前十榜单出炉,差评不断所谓何因?

纵观整个10月的天眼客诉排行榜&#xff0c;可以发现此次名单基本上都是无监管、成立时间短的“新”外汇平台&#xff0c;其中无法出金依旧仍是客诉的关键来源&#xff01; 接下来&#xff0c;就跟着天眼君一起来看看是哪些“新”平台上榜天眼客诉榜&#xff01; 具体客诉排行榜…