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

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



只要修改了這個map那么新增或者修改的map也可以生效了,完結(jié)。
dynamicDataSource動態(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ù)源會根據(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版本以下如果有此屬性,需手動設(shè)置,不然會空指針。
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 "刪除成功";
}
}以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
- springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例
- SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程
- Springboot實(shí)現(xiàn)根據(jù)用戶ID切換動態(tài)數(shù)據(jù)源
- Springboot動態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析
- 詳細(xì)聊聊SpringBoot中動態(tài)切換數(shù)據(jù)源的方法
- Spring配置多數(shù)據(jù)源切換
- SpringBoot AOP方式實(shí)現(xiàn)多數(shù)據(jù)源切換的方法
- Spring配置多個數(shù)據(jù)源并實(shí)現(xiàn)數(shù)據(jù)源的動態(tài)切換功能
相關(guān)文章
SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實(shí)現(xiàn)
本文主要介紹了SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實(shí)現(xiàn),文章詳細(xì)闡述了如何使用SpringBoot3的網(wǎng)絡(luò)請求客戶端進(jìn)行HTTP請求和處理響應(yīng),并提供了示例代碼和說明,具有一定的參考價值,感興趣的可以了解一下2023-08-08
springboot中不能獲取post請求參數(shù)的解決方法
這篇文章主要介紹了springboot中不能獲取post請求參數(shù)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
springboot log4j2不能打印框架錯誤日志的解決方案
這篇文章主要介紹了springboot log4j2不能打印框架錯誤日志的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring Boot拓展XML格式的請求和響應(yīng)操作過程
在我們開發(fā)過程中,我們經(jīng)常使用的參數(shù)絕大多少事HTML和JSON格式的請求和響應(yīng)處理,但是我們在實(shí)際開發(fā)過程中,我們可能經(jīng)歷一些,比如對于XML格式的請求,本文給大家介紹Spring Boot拓展XML格式的請求和響應(yīng),感興趣的朋友一起看看吧2023-10-10
Java 模擬數(shù)據(jù)庫連接池的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 模擬數(shù)據(jù)庫連接池的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02

