springboot+dynamicDataSource动态添加切换数据源方式

网友投稿 1344 2022-09-04


springboot+dynamicDataSource动态添加切换数据源方式

目录springboot dynamicDataSource动态添加切换数据源1.修改初始加载的数据源map2.此时一开始的时候就会加载数据库中的3.但是发现新增数据源或修改数据源时无法操作dynamicDataSource动态添加移除数据源数据源model切换接口

springboot dynamicDataSouhttp://rce动态添加切换数据源

之前有篇写了切换数据源的方法,那些可以在yml中配置固定的几个数据源进行切换后面需要新需求 在数据库实现增删改查数据源 然后连。

之前配置的就不说了自行查看https://jb51.net/article/233975.htm

1.修改初始加载的数据源map

之前传获取的tagetData是直接读取yml中的多个数据源。此时我写了dataTest方法调用主数据直接查询数据库里的某张表 并把表中内容加载成一个个数据源放到map中

2.此时一开始的时候就会加载数据库中的

一张表的数据信息作为数据源。

3.但是发现新增数据源或修改数据源时无法操作

需要重启服务,后面发现DynamicDataSource中有一个Map变量用于存储数据源,在调用其构造函数时候有进行加载

只要修改了这个map那么新增或者修改的map也可以生效了,完结。

dynamicDataSource动态添加移除数据源

数据源model

import io.swagger.annotations.ApiModelProperty;

import lombok.Data;

import javax.validation.constraints.NotBlank;

@Data

public class DataSourceDTO {

@NotBlank

@ApiModelProperty(value = "连接池名称", example = "db1")

private String poolName;

@NotBlank

@ApiModelProperty(value = "JDBC driver", example = "com.mysql.cj.jdbc.Driver")

private String driverClassName;

@NotBlank

@ApiModelProperty(value = "JDBC url 地址", example = "jdbc:mysql://x.x.x.x:3306/x?useUnicode=true&characterEncoding=utf-8")

private String url;

@NotBlank

@ApiModelProperty(value = "JDBC 用户名", example = "sa")

private String username;

@ApiModelProperty(value = "JDBC 密码")

private String password;

}

切换接口

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;

import com.baomidou.dynamic.datasource.creator.*;

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;

import com.lets.web.vo.common.DataSourceDTO;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

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")

@Api(tags = "添加删除数据源")

public class DataSourceController {

@Autowired

private DataSource dataSource;

@Autowired

private DefaultDataSourceCreator dataSourceCreator;

@Autowired

private DruidDataSourceCreator druidDataSourceCreator;

@Autowired

private HikariDataSourceCreator hikariDataSourceCreator;

@GetMapping

@ApiOperation("获取当前所有数据源")

public Set now() {

DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;

return ds.getDataSources().keySet();

}

//通用数据源会根据maven中配置的连接池根据顺序依次选择。

//默认的顺序为druid>hikaricp>beecp>dbcp>spring basic

@PostMapping("/add")

@ApiOperation("通用添加数据源(推荐)")

public Set 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();

}

@PostMapping("/addDruid")

@ApiOperation("基础Druid数据源")

public Set addDruid(@Validated @RequestBody DataSourceDTO dto) {

DataSourceProperty dataSourceProperty = new DataSourceProperty();

BeanUtils.copyProperties(dto, dataSourceProperty);

dataSourcePropehttp://rty.setLazy(true);

DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;

DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty);

ds.addDataSource(dto.getPoolName(), dataSource);

return ds.getDataSources().keySet();

}

@PostMapping("/addHikariCP")

@ApiOperation("基础HikariCP数据源")

public Set addHikariCP(@Validated @RequestBody DataSourceDTO dto) {

DataSourceProperty dataSourceProperty = new DataSourceProperty();

BeanUtils.copyProperties(dto, dataSourceProperty);

dataSourceProperty.setLazy(true);//3.4.0版本以下如果有此属性,需手动设置,不然会空指针。

DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;

DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);

ds.addDataSource(dto.getPoolName(), dataSource);

return ds.getDataSources().keySet();

}

@DeleteMapping

@ApiOperation("删除数据源")

public String remove(String name) {

DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;

ds.removeDataSource(name);

return "删除成功";

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python:处理一些格式规范的文字(python语句书写的基本格式)
下一篇:Python:机器视觉与Tesseract介绍(python做机器视觉)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~