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

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

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

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

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

DataSourceAutoConfiguration 是 SpringBoot 提供的自動配置類

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

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

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

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

這段代碼通過設(shè)置,配置了一個支持動態(tài)切換的數(shù)據(jù)源,默認(rèn)使用 master,用于運行時動態(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;
    }

    /**
     * 配置動態(tài)數(shù)據(jù)源
     *
     * @return 動態(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ù)源切換的實現(xiàn)的關(guān)鍵是 AbstractRoutingDataSource

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

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

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

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

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

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

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

    // 設(shè)置targetDataSources并記錄數(shù)據(jù)源(這里可以記錄每個數(shù)據(jù)源的最近使用時間,可以做刪除不經(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Spring開發(fā)之自定義標(biāo)簽及其解析

    基于Spring開發(fā)之自定義標(biāo)簽及其解析

    Spring框架是現(xiàn)在Java最流行的開源框架之一,需要實現(xiàn)一些自定義的標(biāo)簽,主要是方便使用我們框架的人能夠快速、簡單進(jìn)行配置,有興趣的可以了解一下。
    2017-04-04
  • 解讀spring.factories文件配置詳情

    解讀spring.factories文件配置詳情

    這篇文章主要介紹了解讀spring.factories文件配置詳情,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 詳解spring boot starter redis配置文件

    詳解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通過配置RedisConnectionFactory中的相關(guān)參數(shù)去實現(xiàn)連接redis service。下面通過本文給大家介紹在spring boot的配置文件中redis的基本配置,需要的的朋友參考下
    2017-07-07
  • SpringBoot框架aop切面的execution表達(dá)式解讀

    SpringBoot框架aop切面的execution表達(dá)式解讀

    這篇文章主要介紹了SpringBoot框架aop切面的execution表達(dá)式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    在Java開發(fā)過程中,SSL(Secure Sockets Layer)握手異常是一個常見的網(wǎng)絡(luò)通信錯誤,特別是在使用HTTPS協(xié)議進(jìn)行安全通信時,本文將詳細(xì)分析javax.net.ssl.SSLHandshakeException: SSL這一異常的背景、可能的原因,并通過代碼示例幫助您理解和解決這一問題
    2024-12-12
  • Java中replace的用法實例講解

    Java中replace的用法實例講解

    這篇文章主要給大家介紹了關(guān)于Java中replace用法的相關(guān)資料,Java中的replace方法是用于字符串替換的方法,它可以接受兩個參數(shù),第一個參數(shù)是需要被替換的字符串,第二個參數(shù)是替換后的字符串,需要的朋友可以參考下
    2024-04-04
  • Java面向?qū)ο笾鄳B(tài)

    Java面向?qū)ο笾鄳B(tài)

    這篇文章主要介紹了Java面向?qū)ο笾鄳B(tài),文章以什么是多態(tài)、多態(tài)的實現(xiàn)條件、多態(tài)的訪問特點、多態(tài)的優(yōu)點和缺點的相關(guān)資料展開文章內(nèi)容,需要的小伙伴可以參考一下
    2021-10-10
  • Java實現(xiàn)獲取服務(wù)器資源(內(nèi)存,負(fù)載,磁盤容量)

    Java實現(xiàn)獲取服務(wù)器資源(內(nèi)存,負(fù)載,磁盤容量)

    這篇文章主要為大家詳細(xì)介紹了如何Java實現(xiàn)獲取服務(wù)器資源信息,包括內(nèi)存,負(fù)載,磁盤容量等內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決

    Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決

    這篇文章主要介紹了Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 在Linux系統(tǒng)上升級Java版本的兩種方法步驟

    在Linux系統(tǒng)上升級Java版本的兩種方法步驟

    由于項目升級,需要將JDK7升級到JDK8,升級JDK的同時也要升級一些其他的版本,下面這篇文章主要給大家介紹了關(guān)于在Linux系統(tǒng)上升級Java版本的兩種方法步驟,需要的朋友可以參考下
    2024-09-09

最新評論