一、 业务场景解释
由于公司业务需要开发设计一款文件读取导入工具,导入的配置和目标数据库并不一定在同一个数据库地址,故需要使用到自定义数据源,并且支持数据源切换
大致场景如下:
二、工具选择
鉴于市面上有很多工具,具体查找资料时也看的了很多,比如比较原生的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 {
@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