欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中配置多數(shù)據(jù)源的方法詳解

 更新時(shí)間:2024年02月03日 08:16:33   作者:哪里的破水瓶  
這篇文章主要為大家詳細(xì)介紹了SpringBoot中配置多數(shù)據(jù)源的方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

開始配置多數(shù)據(jù)源

首先我們需要先移除自動(dòng)配置數(shù)據(jù)源,SpringBoot 的默認(rèn)行為

DataSourceAutoConfiguration 是 SpringBoot 提供的自動(dòng)配置類

@SpringBootApplication(scanBasePackages = "com", exclude = {DataSourceAutoConfiguration.class})

下面首先讀取了默認(rèn)數(shù)據(jù)源的信息,通過(guò) getProperties() 封裝成一個(gè) Map 對(duì)象

定義了一個(gè)名為 dynamicDataSource 的 bean 是數(shù)據(jù)源路由器,它繼承了 AbstractRoutingDataSource 類,我們可以根據(jù)規(guī)則選擇要使用的數(shù)據(jù)源。

dataSource 方法接受一個(gè) Map,并返回一個(gè)數(shù)據(jù)源,于是我們就創(chuàng)建了一個(gè)數(shù)據(jù)源

這段代碼通過(guò)設(shè)置,配置了一個(gè)支持動(dòng)態(tài)切換的數(shù)據(jù)源,默認(rèn)使用 master,用于運(yùn)行時(shí)動(dòng)態(tài)切換數(shù)據(jù)源。

@Configuration
@Slf4j
public class DataSourceConfigurer {

    @Value("${spring.datasource.druid.master.url}")
    private String url;

    @Value("${spring.datasource.druid.master.username}")
    private String username;

    @Value("${spring.datasource.druid.master.password}")
    private String password;

    @Value("${spring.datasource.driverClassName}")
    private String driverClassName;

    /**
     * 獲取數(shù)據(jù)源配置信息
     *
     * @return 數(shù)據(jù)源配置信息
     */
    private Map<String, Object> getProperties() {
        Map<String, Object> map = new HashMap<>();
        map.put("driverClassName", driverClassName);
        map.put("url", url);
        map.put("username", username);
        map.put("password", password);
        return map;
    }

    /**
     * 配置動(dòng)態(tài)數(shù)據(jù)源
     *
     * @return 動(dòng)態(tài)數(shù)據(jù)源
     */
    @Bean("dynamicDataSource")
    public DynamicRoutingDataSource dynamicDataSource() {
        DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
        
        // 創(chuàng)建數(shù)據(jù)源
        DataSource dataSource = dynamicRoutingDataSource.dataSource(getProperties());
        
        // 設(shè)置數(shù)據(jù)源映射
        Map<Object, Object> dataSourceMap = new HashMap<>(1);
        dataSourceMap.put("default_db", dataSource);
        dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
        
        // 設(shè)置默認(rèn)數(shù)據(jù)源
        dynamicRoutingDataSource.setDefaultTargetDataSource(dataSource);
        
        return dynamicRoutingDataSource;
    }
}

具體切換多數(shù)據(jù)源的邏輯 DynamicRoutingDataSource

多數(shù)據(jù)源切換的實(shí)現(xiàn)的關(guān)鍵是 AbstractRoutingDataSource

我們這里創(chuàng)建了一個(gè) targetTargetDataSources 是一個(gè) Map 存儲(chǔ)數(shù)據(jù)源的數(shù)據(jù),key 數(shù)據(jù)源的標(biāo)識(shí),value 是具體的數(shù)據(jù)源。通過(guò) setTargetDataSources 可以設(shè)置數(shù)據(jù)源,在運(yùn)行時(shí),通過(guò)該方法切換。

通過(guò) addDataSource 添加數(shù)據(jù)源,并通過(guò) setTargetDataSources 使數(shù)據(jù)源生效。

existDataSource 是判斷數(shù)據(jù)源是否存在

dataSource 這個(gè)是重要的方法,它是為數(shù)據(jù)源在druid 連接池中創(chuàng)建了資源,配置了數(shù)據(jù)源。

/**
 * 動(dòng)態(tài)數(shù)據(jù)源
 */
@Slf4j
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {

    private static Map<Object, Object> targetTargetDataSources = new ConcurrentHashMap<>();

    @Override
    protected Object determineCurrentLookupKey() {
        // 每次連接數(shù)據(jù)庫(kù),都會(huì)去設(shè)置數(shù)據(jù)源
        return DynamicDataSourceContextHolder.getDataSourceKey();
    }

    // 設(shè)置targetDataSources并記錄數(shù)據(jù)源(這里可以記錄每個(gè)數(shù)據(jù)源的最近使用時(shí)間,可以做刪除不經(jīng)常使用的數(shù)據(jù)源)
    @Override
    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
        targetTargetDataSources = targetDataSources;
    }

    // 添加數(shù)據(jù)源
    public void addDataSource(String tenant, Map<String, Object> dataSourceProperties) {
        targetTargetDataSources.put(tenant, dataSource(dataSourceProperties));
        super.setTargetDataSources(targetTargetDataSources);
        afterPropertiesSet();
    }

    // 判斷是否存在數(shù)據(jù)源,存在直接取
    public boolean existDataSource(String tenant) {
        return targetTargetDataSources.containsKey(tenant);
    }

    // 組裝數(shù)據(jù)源
    public DataSource dataSource(Map<String, Object> dataSourceProperties) {
        DataSource dataSource;
        try {
            dataSource = DruidDataSourceFactory.createDataSource(dataSourceProperties);
        } catch (Exception e) {
            log.error("dataSource: {}", e.getMessage());
            throw new RuntimeException();
        }
        return dataSource;
    }
}

到此這篇關(guān)于SpringBoot中配置多數(shù)據(jù)源的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置多數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法

    java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法

    這篇文章主要介紹了java基于dom4j包實(shí)現(xiàn)對(duì)XML解析的方法,結(jié)合實(shí)例形式分析了java針對(duì)xml格式數(shù)據(jù)的相關(guān)解析操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • Java中雙冒號(hào)運(yùn)算符(::)的用法詳解

    Java中雙冒號(hào)運(yùn)算符(::)的用法詳解

    在Java 8引入的Lambda表達(dá)式和函數(shù)式接口之后,雙冒號(hào)運(yùn)算符(::)成為了一項(xiàng)重要的功能,下面我們就來(lái)學(xué)習(xí)一下Java中的雙冒號(hào)運(yùn)算符及其常見(jiàn)應(yīng)用場(chǎng)景吧
    2023-12-12
  • Java List雙擊事件實(shí)現(xiàn)方法

    Java List雙擊事件實(shí)現(xiàn)方法

    這篇文章主要介紹了Java List雙擊事件實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • SpringBoot調(diào)用第三方WebService接口的兩種方法

    SpringBoot調(diào)用第三方WebService接口的兩種方法

    本文主要介紹了SpringBoot調(diào)用第三方WebService接口的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)

    SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼),本次內(nèi)容主要學(xué)習(xí)如何做一個(gè)發(fā)送驗(yàn)證碼和識(shí)別驗(yàn)證碼的功能,需要的朋友可以參考下
    2024-06-06
  • 使用springboot防止反編譯proguard+xjar

    使用springboot防止反編譯proguard+xjar

    介紹了三種代碼混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字節(jié)碼,Xjar提供對(duì)JAR包內(nèi)資源的加密和動(dòng)態(tài)解密,而ClassFinal則支持直接加密JAR包或WAR包,通過(guò)預(yù)研和實(shí)際操作
    2024-11-11
  • Spring的@PropertySource注解源碼解析

    Spring的@PropertySource注解源碼解析

    這篇文章主要介紹了Spring的@PropertySource注解源碼解析,就以源碼時(shí)序圖的方式,直觀的感受下@PropertySource注解在Spring源碼層面的執(zhí)行流程,需要的朋友可以參考下
    2023-11-11
  • Java中用戶線程與守護(hù)線程的使用區(qū)別

    Java中用戶線程與守護(hù)線程的使用區(qū)別

    這篇文章主要介紹了Java中用戶線程與守護(hù)線程的使用區(qū)別,Java語(yǔ)言中無(wú)論是線程還是線程池,默認(rèn)都是用戶線程,因此用戶線程也被成為普通線程,下文關(guān)于其與守護(hù)線程的區(qū)別詳情,需要的小伙伴可以參考一下
    2022-05-05
  • 淺談java定時(shí)器的發(fā)展歷程

    淺談java定時(shí)器的發(fā)展歷程

    這篇文章主要介紹了淺談java定時(shí)器的發(fā)展歷程,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 單一職責(zé)原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    單一職責(zé)原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了單一職責(zé)原則的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論