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

【备忘录】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

相关文章:

  • 信号灯集,消息队列
  • 在Linux上编译gdal3.1.2指南
  • 自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目
  • 计算机毕业设计选题推荐-超市售货微信小程序/安卓APP-项目实战
  • STM32:I²C通信原理概要
  • 可视化 | 数据可视化降维算法梳理
  • gorilla/websocket的chat示例代码简单分析
  • Web3公链之Cosmos生态的项目Celestia
  • Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作
  • Redis Functions 介绍(一)
  • go中“哨兵错误”的由来及使用建议
  • Docker compose容器编排
  • Python 自动化(十六)静态文件处理
  • 在跑腿App系统开发中,如何构建系统架构?
  • 循环神经网络 - RNN
  • [译] 怎样写一个基础的编译器
  • 【comparator, comparable】小总结
  • Flex布局到底解决了什么问题
  • Mocha测试初探
  • mysql_config not found
  • Mysql数据库的条件查询语句
  • Python打包系统简单入门
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Cloud中负载均衡器概览
  • SpringBoot 实战 (三) | 配置文件详解
  • yii2中session跨域名的问题
  • 闭包--闭包之tab栏切换(四)
  • 电商搜索引擎的架构设计和性能优化
  • 基于web的全景—— Pannellum小试
  • 七牛云假注销小指南
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 网页视频流m3u8/ts视频下载
  • 小程序 setData 学问多
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 主流的CSS水平和垂直居中技术大全
  • 带你开发类似Pokemon Go的AR游戏
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​香农与信息论三大定律
  • #1014 : Trie树
  • ${factoryList }后面有空格不影响
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (pojstep1.3.1)1017(构造法模拟)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (补)B+树一些思想
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (强烈推荐)移动端音视频从零到上手(下)
  • (五)MySQL的备份及恢复
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)shell中括号的特殊用法 linux if多条件判断