SpringBoot运行时数据源动态切换
解决问题
需要在运行中对数据源进行不同的切换、添加
即启动项目后进行数据源切换、添加、删除、查看等
解决方式
主要使用baomidou的dynamic-datasource工具进行操作
具体操作如下:
引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
对应controller接口:
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.zsk.generator.entity.DataSourceDTO;
import com.zsk.generator.entity.PlmcBaseInfoEntity;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Set;
/**
* @Author XuZhuHong
* @CreateTime 2022/11/2 16:01
*/
@RequestMapping("Plmc")
@RestController
public class PlmcSetController {
@Resource
private DataSource dataSource;
@Resource
private DefaultDataSourceCreator dataSourceCreator;
@Resource
private DruidDataSourceCreator druidDataSourceCreator;
public static String modelName = "";
public static String author = "";
public static String email = "";
/**
* 通用数据源会根据maven中配置的连接池根据顺序依次选择。
* 默认的顺序为druid>hikaricp>beecp>dbcp>spring basic
*
* @param dto 数据源对象
* @return
*/
@PostMapping("/setDataSources")
public String setDataSources(@Validated @RequestBody DataSourceDTO dto) {
//先删除这个连接的
removeDatasource(dto.getPoolName());
//添加传入的数据信息
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPoolName(), dataSource);
//设置为主要的
ds.setPrimary(dto.getPoolName());
return ds.getDataSources().keySet().toString();
}
@PostMapping("/setDruidDatasource")
public Set< String > setDruidDatasource(@Validated @RequestBody DataSourceDTO dto) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
dataSourceProperty.setLazy(true);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPoolName(), dataSource);
return ds.getDataSources().keySet();
}
@PostMapping("removeDatasource")
public String removeDatasource(String name) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
try {
ds.removeDataSource(name);
} catch (Exception e) {
System.out.println("没有这个数据连接");
}
return "删除成功";
}
}
对应实体类:
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author Xuzhuh
*/
@Data
public class DataSourceDTO {
@NotBlank
private String poolName;
@NotBlank
private String driverClassName;
@NotBlank
private String url;
@NotBlank
private String username;
private String password;
}