溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源

發(fā)布時(shí)間:2022-01-07 15:37:43 來(lái)源:億速云 閱讀:1119 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

springboot dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源

之前有篇寫了切換數(shù)據(jù)源的方法,那些可以在yml中配置固定的幾個(gè)數(shù)據(jù)源進(jìn)行切換后面需要新需求 在數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查數(shù)據(jù)源 然后連。

之前配置的就不說(shuō)了自行查看http://www.kemok4.com/article/233975.htm

1.修改初始加載的數(shù)據(jù)源map

之前傳獲取的tagetData是直接讀取yml中的多個(gè)數(shù)據(jù)源。此時(shí)我寫了dataTest方法調(diào)用主數(shù)據(jù)直接查詢數(shù)據(jù)庫(kù)里的某張表 并把表中內(nèi)容加載成一個(gè)個(gè)數(shù)據(jù)源放到map中

springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源

2.此時(shí)一開始的時(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)行加載

springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源

springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源

springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源

只要修改了這個(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 "刪除成功";
    }
}

以上就是“springboot+dynamicDataSource怎么實(shí)現(xiàn)動(dòng)態(tài)添加切換數(shù)據(jù)源”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI