国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot 多數(shù)據(jù)源 dynamic-datasource動態(tài)添加移除數(shù)據(jù)源

這篇具有很好參考價值的文章主要介紹了Springboot 多數(shù)據(jù)源 dynamic-datasource動態(tài)添加移除數(shù)據(jù)源。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0.前言

上一篇文章我們講了如何通過多數(shù)據(jù)源組件,在Spring boot Druid 連接池項目中配置多數(shù)據(jù)源,并且通過@DS注解的方式切換數(shù)據(jù)源,《Spring Boot 配置多數(shù)據(jù)源【最簡單的方式】》。但是在多租戶的業(yè)務(wù)場景中,我們通常需要手動的切換數(shù)據(jù)源,那么本文將解答你的額疑惑。

1. 動態(tài)添加移除數(shù)據(jù)源

dynamic-datasource是一款基于Spring Boot 動態(tài)數(shù)據(jù)源框架,在應(yīng)用程序運行時可以動態(tài)添加、移除數(shù)據(jù)源的功能。
Springboot 多數(shù)據(jù)源 dynamic-datasource動態(tài)添加移除數(shù)據(jù)源,Mybatis-Plus進階系列,后端,java,spring boot

2.基礎(chǔ)介紹

本文我們還是以dynamic-datasource來進階學習。提供了一系列的API和配置項,可以非常方便地實現(xiàn)動態(tài)添加、移除數(shù)據(jù)源的功能。本文將介紹如何使用dynamic-datasource動態(tài)添加、移除數(shù)據(jù)源,并對相關(guān)代碼進行解析。在多租戶應(yīng)用、讀寫分離等場景下,動態(tài)數(shù)據(jù)源可以方便地實現(xiàn)數(shù)據(jù)源的動態(tài)切換,提高應(yīng)用程序的靈活性和擴展性。
主要在多租戶場景中,常常新的一個租戶進來需要動態(tài)的添加一個數(shù)據(jù)源到庫中,使得系統(tǒng)不用重啟即可切換數(shù)據(jù)源。

3. 使用步驟示例

dynamic-datasource 3.4.0及以上版本和老版本注入方式有一定差別,根據(jù)自己版本注入。
注意一定要讓多數(shù)據(jù)源使用 @Primary ,讓其成為主數(shù)據(jù)源。

簡單示例,自己手動構(gòu)造dataSource

//3.4.0版本以下
@Primary
@Bean
public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { 
    DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
    dataSource.setPrimary(properties.getPrimary());
    dataSource.setStrict(properties.getStrict());
    dataSource.setStrategy(properties.getStrategy());
    dataSource.setProvider(dynamicDataSourceProvider);
    dataSource.setP6spy(properties.getP6spy());
    dataSource.setSeata(properties.getSeata());
    return dataSource;
}

//3.4.0版本及以上
@Primary
@Bean
public DataSource dataSource() {
    DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
    dataSource.setPrimary(properties.getPrimary());
    dataSource.setStrict(properties.getStrict());
    dataSource.setStrategy(properties.getStrategy());
    dataSource.setP6spy(properties.getP6spy());
    dataSource.setSeata(properties.getSeata());
    return dataSource;
}

主要變更是因為3.4.0支持了多個provider同時生效,采取了內(nèi)部注入。 源碼改動參考
https://github.com/baomidou/dynamic-datasource-spring-boot-starter/commit/6e8d2954499f83269302d23b58f8832c31e07ef7

復雜示例,使用DataSourceCreator構(gòu)造dataSource

本文我們還是以dynamic-datasource來進階學習。提供了一系列的API和配置項,可以非常方便地實現(xiàn)動態(tài)添加、移除數(shù)據(jù)源的功能。本文將介紹如何使用dynamic-datasource動態(tài)添加、移除數(shù)據(jù)源,并對相關(guān)代碼進行解析。在多租戶應(yīng)用、讀寫分離等場景下,動態(tài)數(shù)據(jù)源可以方便地實現(xiàn)數(shù)據(jù)源的動態(tài)切換,提高應(yīng)用程序的靈活性和擴展性。
主要在多租戶場景中,常常新的一個租戶進來需要動態(tài)的添加一個數(shù)據(jù)源到庫中,使得系統(tǒng)不用重啟即可切換數(shù)據(jù)源。

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.*;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.samples.ds.dto.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;
   // private final DataSourceCreator dataSourceCreator; //3.3.1及以下版本使用這個通用,強烈推薦sb2用戶至少升級到3.5.2版本

    @Autowired
    private DefaultDataSourceCreator dataSourceCreator;
//如果是用4.x以上版本,因為要和spring解綁,重構(gòu)了一些東西,比如缺少了懶啟動和啟動初始化數(shù)據(jù)庫。不太建議用以下獨立的創(chuàng)建器,只建議用上面的DefaultDataSourceCreator 
    @Autowired
    private BasicDataSourceCreator basicDataSourceCreator;
    @Autowired
    private JndiDataSourceCreator jndiDataSourceCreator;
    @Autowired
    private DruidDataSourceCreator druidDataSourceCreator;
    @Autowired
    private HikariDataSourceCreator hikariDataSourceCreator;
    @Autowired
    private BeeCpDataSourceCreator beeCpDataSourceCreator;
    @Autowired
    private Dbcp2DataSourceCreator dbcp2DataSourceCreator;

    @GetMapping
    @ApiOperation("獲取當前所有數(shù)據(jù)源")
    public Set<String> now() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().keySet();
    }

    //通用數(shù)據(jù)源會根據(jù)maven中配置的連接池根據(jù)順序依次選擇。
    //默認的順序為druid>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("/addBasic(強烈不推薦,除了用了馬上移除)")
    @ApiOperation(value = "添加基礎(chǔ)數(shù)據(jù)源", notes = "調(diào)用Springboot內(nèi)置方法創(chuàng)建數(shù)據(jù)源,兼容1,2")
    public Set<String> addBasic(@Validated @RequestBody DataSourceDTO dto) {
        DataSourceProperty dataSourceProperty = new DataSourceProperty();
        BeanUtils.copyProperties(dto, dataSourceProperty);
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        DataSource dataSource = basicDataSourceCreator.createDataSource(dataSourceProperty);
        ds.addDataSource(dto.getPoolName(), dataSource);
        return ds.getDataSources().keySet();
    }

    @PostMapping("/addJndi")
    @ApiOperation("添加JNDI數(shù)據(jù)源")
    public Set<String> addJndi(String pollName, String jndiName) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        DataSource dataSource = jndiDataSourceCreator.createDataSource(jndiName);
        ds.addDataSource(poolName, 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();
    }

    @PostMapping("/addBeeCp")
    @ApiOperation("基礎(chǔ)BeeCp數(shù)據(jù)源")
    public Set<String> addBeeCp(@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 = beeCpDataSourceCreator.createDataSource(dataSourceProperty);
        ds.addDataSource(dto.getPoolName(), dataSource);
        return ds.getDataSources().keySet();
    }

    @PostMapping("/addDbcp")
    @ApiOperation("基礎(chǔ)Dbcp數(shù)據(jù)源")
    public Set<String> addDbcp(@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 = dbcp2DataSourceCreator.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 "刪除成功";
    }
}

4. 示例項目

https://github.com/dynamic-datasource/dynamic-datasource-samples/tree/master/features-samples/add-remove-datasource-sample

5. 源碼分析

public interface DataSourceCreator {

    /**
     * 通過屬性創(chuàng)建數(shù)據(jù)源
     *
     * @param dataSourceProperty 數(shù)據(jù)源屬性
     * @return 被創(chuàng)建的數(shù)據(jù)源
     */
    DataSource createDataSource(DataSourceProperty dataSourceProperty);

    /**
     * 當前創(chuàng)建器是否支持根據(jù)此屬性創(chuàng)建
     *
     * @param dataSourceProperty 數(shù)據(jù)源屬性
     * @return 是否支持
     */
    boolean support(DataSourceProperty dataSourceProperty);
}

DataSourceCreator是一個接口,定義了根據(jù)參數(shù)創(chuàng)建數(shù)據(jù)源的接口。
其他creator實現(xiàn)此接口,本項目暫時實現(xiàn)了Druid和Hikaricp的等連接池的實現(xiàn)。
BasicDataSourceCreator 是調(diào)用Spring原生的創(chuàng)建方式,只支持最最原始的基礎(chǔ)配置。
DefaultDataSourceCreator 是一個通用的創(chuàng)建器,其根據(jù)環(huán)境自動選擇連接池,文章來源地址http://www.zghlxwxcb.cn/news/detail-647852.html

到了這里,關(guān)于Springboot 多數(shù)據(jù)源 dynamic-datasource動態(tài)添加移除數(shù)據(jù)源的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Springboot+mybatis-plus+dynamic-datasource+Druid 多數(shù)據(jù)源 分布式事務(wù)

    Springboot+mybatis-plus+dynamic-datasource+Druid 多數(shù)據(jù)源 分布式事務(wù)

    背景 處理多數(shù)據(jù)源事務(wù)一直是一個復雜而棘手的問題,通常我們有兩種主流的解決方法。 第一種是通過Atomikos手動創(chuàng)建多數(shù)據(jù)源事務(wù),這種方法更適合數(shù)據(jù)源數(shù)量較少,參數(shù)配置不復雜,對性能要求不高的項目。然而,這種方法的最大困難在于需要手動配置大量設(shè)置,這可能

    2024年02月11日
    瀏覽(26)
  • 【源碼解析】多數(shù)據(jù)源 dynamic-datasource快速入門及源碼解析

    【源碼解析】多數(shù)據(jù)源 dynamic-datasource快速入門及源碼解析

    啟動的時候,會加載在 dynamic-datasource-spring-boot-starter 的jar包中的 spring.factories 在 DynamicDataSourceAutoConfiguration 會注入 DynamicRoutingDataSource DynamicRoutingDataSource#afterPropertiesSet ,系統(tǒng)啟動的時候會加載所有的數(shù)據(jù)源 在 DynamicDataSourceAutoConfiguration 會注入 DynamicDataSourceProvider AbstractData

    2023年04月21日
    瀏覽(21)
  • Dynamic DataSource 多數(shù)據(jù)源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    Dynamic DataSource 多數(shù)據(jù)源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    MybatisPlus多數(shù)據(jù)源配置主要解決的是多數(shù)據(jù)庫連接和切換的問題。在一些大型應(yīng)用中,由于數(shù)據(jù)量的增長或者業(yè)務(wù)模塊的增多,可能需要訪問多個數(shù)據(jù)庫。這時,就需要配置多個數(shù)據(jù)源。 2.1.1、引用依賴 2.1.2、application.yml 配置 2.1.3、通用配置類 2.1.4、使用方式 這里便不過多的

    2024年02月03日
    瀏覽(32)
  • Springboot+dynamic-datasource+Druid數(shù)據(jù)庫配置加密

    Springboot+dynamic-datasource+Druid數(shù)據(jù)庫配置加密

    Springboot+mybatis-plus+dynamic-datasource+Druid數(shù)據(jù)庫配置加密 背景 生產(chǎn)環(huán)境中, 為了保密,我們希望將數(shù)據(jù)庫密碼加密, 甚至用戶名和jdbc連接串加密。本章我們使用由苞米豆(baomidou)團隊開發(fā)的 dynamic-datasource 多數(shù)據(jù)源組件自帶的加密工具實現(xiàn)數(shù)據(jù)庫配置加密 從 dynamic-datasource-star

    2024年02月04日
    瀏覽(43)
  • 使用多數(shù)據(jù)源dynamic-datasource-spring-boot-starter遇到的問題記錄

    使用多數(shù)據(jù)源dynamic-datasource-spring-boot-starter遇到的問題記錄

    記錄使用多數(shù)據(jù)源dynamic-datasource-spring-boot-starter遇到的問題: 1、工程啟動失敗 缺少clickhouse連接驅(qū)動,引入對應(yīng)的maven依賴 2、clickhouse的sql語句讀到了mysql數(shù)據(jù)庫 在工程的配置文件只配置了ck數(shù)據(jù)源配置的時候,@DS(“數(shù)據(jù)源名稱”)用在service接口上沒什么問題。 由于新的需求

    2024年02月15日
    瀏覽(28)
  • 使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫

    記錄 :415 場景 :使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫。 版本 :JDK 1.8,Spring?Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源碼 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一個基于springboot的快

    2023年04月19日
    瀏覽(23)
  • 苞米豆的多數(shù)據(jù)源 → dynamic-datasource-spring-boot-starter,挺香的!

    苞米豆的多數(shù)據(jù)源 → dynamic-datasource-spring-boot-starter,挺香的!

    2023年元旦,我媽又開始了對我的念叨 媽:你到底想多少歲結(jié)婚 我:60 媽:60,你想找個多大的 我:找個55的啊,她55我60,結(jié)婚都有退休金,不用上班不用生孩子,不用買車買房,成天就是玩兒 我:而且一結(jié)婚就是白頭偕老,多好 我媽直接一大嘴巴子呼我臉上 最近接到一個

    2023年04月21日
    瀏覽(19)
  • 分享一個優(yōu)秀的動態(tài)數(shù)據(jù)源開源庫-dynamic-datasource-spring-boot-starter

    分享一個優(yōu)秀的動態(tài)數(shù)據(jù)源開源庫-dynamic-datasource-spring-boot-starter

    在我們的Java后端研發(fā)工作中, 有時候由于業(yè)務(wù)的快速迭代和數(shù)據(jù)的安全隔離性,往往會為不同的 API業(yè)務(wù)線分配不同的數(shù)據(jù)庫,即一個微服務(wù)經(jīng)常需要和多個數(shù)據(jù)源打交道。 dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器。 其支持 Jdk 1.7+, Spring

    2024年02月12日
    瀏覽(18)
  • 使用dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(MyBatis-3.5.9)

    記錄 :383 場景 :使用dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源,使用MyBatis操作數(shù)據(jù)庫。提供三種示例:一,使用@DS注解作用到類上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder類在方法內(nèi)靈活切換不同數(shù)據(jù)源。 源碼: https://github.com/

    2024年01月20日
    瀏覽(25)
  • MyBatis Plus 插件 動態(tài)數(shù)據(jù)源實現(xiàn)原理與源碼講解 (dynamic-datasource-spring-boot-starter-master)

    MyBatis Plus 插件 動態(tài)數(shù)據(jù)源實現(xiàn)原理與源碼講解 (dynamic-datasource-spring-boot-starter-master)

    目錄 1. 介紹 2. 基本原理 3. 源碼介紹 3.1 使用 AOP 攔截,方法執(zhí)行前獲取到當前方法要用的數(shù)據(jù)源 3.2 實現(xiàn)自定義?DataSource 接口,實現(xiàn) DataSource 接口的 getConnect 方法做動態(tài)處理 多數(shù)據(jù)源即一個項目中同時存在多個不同的數(shù)據(jù)庫連接池。 比如 127.0.0.1:3306/test? ?127.0.0.1:3307/test?

    2024年02月07日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包