springboot+dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源方式
springboot dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源
之前有篇寫(xiě)了切換數(shù)據(jù)源的方法,那些可以在yml中配置固定的幾個(gè)數(shù)據(jù)源進(jìn)行切換后面需要新需求 在數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查數(shù)據(jù)源 然后連。
之前配置的就不說(shuō)了自行查看http://chabaoo.cn/article/233975.htm
1.修改初始加載的數(shù)據(jù)源map
之前傳獲取的tagetData是直接讀取yml中的多個(gè)數(shù)據(jù)源。此時(shí)我寫(xiě)了dataTest方法調(diào)用主數(shù)據(jù)直接查詢數(shù)據(jù)庫(kù)里的某張表 并把表中內(nèi)容加載成一個(gè)個(gè)數(shù)據(jù)源放到map中

2.此時(shí)一開(kāi)始的時(shí)候就會(huì)加載數(shù)據(jù)庫(kù)中的
一張表的數(shù)據(jù)信息作為數(shù)據(jù)源。
3.但是發(fā)現(xiàn)新增數(shù)據(jù)源或修改數(shù)據(jù)源時(shí)無(wú)法操作
需要重啟服務(wù),后面發(fā)現(xiàn)DynamicDataSource中有一個(gè)Map變量用于存儲(chǔ)數(shù)據(jù)源,在調(diào)用其構(gòu)造函數(shù)時(shí)候有進(jìn)行加載



只要修改了這個(gè)map那么新增或者修改的map也可以生效了,完結(jié)。
dynamicDataSource動(dòng)態(tài)添加移除數(shù)據(jù)源
數(shù)據(jù)源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 = "添加刪除數(shù)據(jù)源")
public class DataSourceController {
@Autowired
private DataSource dataSource;
@Autowired
private DefaultDataSourceCreator dataSourceCreator;
@Autowired
private DruidDataSourceCreator druidDataSourceCreator;
@Autowired
private HikariDataSourceCreator hikariDataSourceCreator;
@GetMapping
@ApiOperation("獲取當(dāng)前所有數(shù)據(jù)源")
public Set<String> now() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
return ds.getDataSources().keySet();
}
//通用數(shù)據(jù)源會(huì)根據(jù)maven中配置的連接池根據(jù)順序依次選擇。
//默認(rèn)的順序?yàn)閐ruid>hikaricp>beecp>dbcp>spring basic
@PostMapping("/add")
@ApiOperation("通用添加數(shù)據(jù)源(推薦)")
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();
}
@PostMapping("/addDruid")
@ApiOperation("基礎(chǔ)Druid數(shù)據(jù)源")
public Set<String> addDruid(@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("/addHikariCP")
@ApiOperation("基礎(chǔ)HikariCP數(shù)據(jù)源")
public Set<String> addHikariCP(@Validated @RequestBody DataSourceDTO dto) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
dataSourceProperty.setLazy(true);//3.4.0版本以下如果有此屬性,需手動(dòng)設(shè)置,不然會(huì)空指針。
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPoolName(), dataSource);
return ds.getDataSources().keySet();
}
@DeleteMapping
@ApiOperation("刪除數(shù)據(jù)源")
public String remove(String name) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
ds.removeDataSource(name);
return "刪除成功";
}
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例
- SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過(guò)程
- Springboot實(shí)現(xiàn)根據(jù)用戶ID切換動(dòng)態(tài)數(shù)據(jù)源
- Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析
- 詳細(xì)聊聊SpringBoot中動(dòng)態(tài)切換數(shù)據(jù)源的方法
- Spring配置多數(shù)據(jù)源切換
- SpringBoot AOP方式實(shí)現(xiàn)多數(shù)據(jù)源切換的方法
- Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換功能
相關(guān)文章
Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫(xiě)詳細(xì)代碼示例
這篇文章主要為大家詳細(xì)介紹了Mybatis中動(dòng)態(tài)SQL的編寫(xiě)使用,動(dòng)態(tài)SQL技術(shù)是一種根據(jù)特定條件動(dòng)態(tài)拼裝SQL語(yǔ)句的功能,它存在的意義是為了解決拼接SQL語(yǔ)句字符串時(shí)的痛點(diǎn)問(wèn)題,感興趣想要詳細(xì)了解可以參考下文2023-05-05
關(guān)于Android觸摸事件分發(fā)的原理詳析
觸摸事件分發(fā)機(jī)制一直以來(lái)都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢(shì)交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下2022-01-01
Spring Boot Web 開(kāi)發(fā)注解篇
在 Spring Boot 快速入門(mén)中,只要在 pom.xml 加入了 spring-boot-starter-web 依賴,即可快速開(kāi)發(fā) web 應(yīng)用。下文給大家詳細(xì)介紹了spring boot web 開(kāi)發(fā)注解,感興趣的朋友參考下吧2017-08-08
在SpringBoot中通過(guò)jasypt進(jìn)行加密解密的方法
今天小編就為大家分享一篇關(guān)于在SpringBoot中通過(guò)jasypt進(jìn)行加密解密的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Java通過(guò)SSM完成水果商城批發(fā)平臺(tái)流程
這是一個(gè)使用了java+SSM開(kāi)發(fā)的網(wǎng)上水果商城批發(fā)平臺(tái),是一個(gè)實(shí)戰(zhàn)小練習(xí),具有水果商城批發(fā)該有的所有功能,感興趣的朋友快來(lái)看看吧2022-06-06
淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08

