【已解决】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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值