最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

 更新時間:2024年11月15日 09:37:54   作者:碼到三十五  
微服務架構中多數(shù)據(jù)源切換是個常見的需求,Spring Boot 提供了強大的支持來簡化這一過程.本文給大家介紹了SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法,需要的朋友可以參考下

多數(shù)據(jù)源切換原理

多數(shù)據(jù)源切換的原理主要基于 Spring 的 AbstractRoutingDataSource 類。AbstractRoutingDataSource 類允許根據(jù)運行時上下文動態(tài)選擇數(shù)據(jù)源。其核心在于實現(xiàn) determineCurrentLookupKey 方法,該方法決定當前操作使用哪個數(shù)據(jù)源。 AbstractRoutingDataSource 實現(xiàn)多數(shù)據(jù)源切換的原理:

1. 數(shù)據(jù)源映射

  • AbstractRoutingDataSource 內部維護了一個映射(Map),用于存儲數(shù)據(jù)源標識(key)和對應的數(shù)據(jù)源實例(value)。這個映射允許根據(jù)數(shù)據(jù)源標識快速查找和獲取對應的數(shù)據(jù)源。

2. 數(shù)據(jù)源標識的確定

  • AbstractRoutingDataSource 提供了一個抽象方法 determineCurrentLookupKey(),該方法用于確定當前需要使用的數(shù)據(jù)源標識。這個方法需要由子類實現(xiàn),以返回當前線程或請求應該使用的數(shù)據(jù)源標識。

3. 數(shù)據(jù)源的選擇與連接獲取

  • 當應用程序需要獲取數(shù)據(jù)庫連接時,AbstractRoutingDataSource 的 getConnection() 方法會被調用。這個方法首先調用 determineCurrentLookupKey() 方法來獲取當前的數(shù)據(jù)源標識,然后根據(jù)這個標識從內部映射中查找對應的數(shù)據(jù)源。
  • 一旦找到了對應的數(shù)據(jù)源,AbstractRoutingDataSource 就會調用該數(shù)據(jù)源的 getConnection() 方法來獲取實際的數(shù)據(jù)庫連接,并將這個連接返回給應用程序。

4. 數(shù)據(jù)源切換的實現(xiàn)

  • 為了實現(xiàn)數(shù)據(jù)源的動態(tài)切換,通常會在子類中重寫 determineCurrentLookupKey() 方法,并根據(jù)當前的上下文(如線程變量)來確定返回的數(shù)據(jù)源標識。
  • 此外,通常會使用 ThreadLocal 來存儲每個線程的數(shù)據(jù)源標識,這樣每個線程都可以獨立地切換數(shù)據(jù)源而不會互相干擾。

實現(xiàn)步驟

1. 依賴

引入 MySQL 和 Druid 的依賴

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>

2. 配置數(shù)據(jù)源

在 application.yml 文件中配置多個數(shù)據(jù)源。

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      datasource1:
        url: jdbc:mysql://localhost:3306/master_db
        username: root
        password: password
        initial-size: 5
        min-idle: 5
        max-active: 20
        max-wait: 60000
      datasource2:
        url: jdbc:mysql://localhost:3306/slave_db
        username: root
        password: password
        initial-size: 5
        min-idle: 5
        max-active: 20
        max-wait: 60000

3. 創(chuàng)建數(shù)據(jù)源配置類

創(chuàng)建一個配置類來定義數(shù)據(jù)源 Bean。

@Configuration
public class DataSourceConfig {

    @Bean
    @ConditionalOnProperty(prefix = "spring.datasource.druid", name = "datasource1")
    @ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
    public DataSource dataSource1() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConditionalOnProperty(prefix = "spring.datasource.druid", name = "datasource2")
    @ConfigurationProperties(prefix = "spring.datasource.druid.datasource2")
    public DataSource dataSource2() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public DataSource dynamicDataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setDefaultTargetDataSource(dataSource1());
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("dataSource1", dataSource1());
        targetDataSources.put("dataSource2", dataSource2());
        dynamicDataSource.setTargetDataSources(targetDataSources);
        return dynamicDataSource;
    }
}

4. 實現(xiàn) AbstractRoutingDataSource

創(chuàng)建一個繼承自 AbstractRoutingDataSource 的類,并實現(xiàn) determineCurrentLookupKey 方法。

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

5. 創(chuàng)建 DataSourceContextHolder

創(chuàng)建一個工具類來保存當前線程的數(shù)據(jù)源信息。

public class DataSourceContextHolder {

    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSource(String dataSource) {
        CONTEXT_HOLDER.set(dataSource);
    }

    public static String getDataSource() {
        return CONTEXT_HOLDER.get();
    }

    public static void clearDataSource() {
        CONTEXT_HOLDER.remove();
    }
}

6. AOP動態(tài)切換數(shù)據(jù)源

使用 AOP 在方法執(zhí)行前后切換數(shù)據(jù)源。

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DataSourceAspect {
	// 方法或者類上的橫切點
    @Pointcut("@annotation(dataSource) || @within(dataSource)")
    public void dataSourcePointcut(DataSource dataSource) {}

    @Before("dataSourcePointcut(dataSource)")
    public void switchDataSource(JoinPoint joinPoint, DataSource dataSource) {
        // 從注解中獲取數(shù)據(jù)源標識
        String dataSourceKey = dataSource.value();
        // 切換到指定的數(shù)據(jù)源
        DataSourceContextHolder.setDataSourceType(dataSourceKey);
    }

    @AfterReturning(pointcut = "dataSourcePointcut(dataSource)", returning = "result")
    public void restoreDataSource(JoinPoint joinPoint, DataSource dataSource, Object result) {
        // 恢復默認數(shù)據(jù)源(可選)
        DataSourceContextHolder.clearDataSourceType();
    }
}

/**
* 自定義注解
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {

    String value() default "dataSource1";
}

7. 使用自定義注解

在需要切換數(shù)據(jù)源的方法上使用自定義注解。

注意

  • 數(shù)據(jù)源切換的邏輯應該盡可能簡單和高效,以避免對應用程序性能產(chǎn)生負面影響。
  • 在切換數(shù)據(jù)源時,需要注意事務管理的問題,確保在同一個事務中只使用同一個數(shù)據(jù)源。

到此這篇關于SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法的文章就介紹到這了,更多相關SpringBoot Druid與數(shù)據(jù)源切換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaEE idea的smart tomcat插件使用

    JavaEE idea的smart tomcat插件使用

    這篇文章主要介紹了JavaEE idea的smart tomcat插件使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Maven依賴管理的用法介紹

    Maven依賴管理的用法介紹

    依賴管理是項目管理中非常重要的一環(huán)。幾乎任何項目開發(fā)的時候需要都需要使用到庫。而這些庫很可能又依賴別的庫,這樣整個項目的依賴形成了一個樹狀結構,而隨著這個依賴的樹的延伸和擴大,一系列問題就會隨之產(chǎn)生
    2022-08-08
  • Java環(huán)境配置圖文教程(推薦)

    Java環(huán)境配置圖文教程(推薦)

    下面小編就為大家?guī)硪黄狫ava環(huán)境配置圖文教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java方法遞歸的形式和常見遞歸算法(方法遞歸結合File類查找文件)

    Java方法遞歸的形式和常見遞歸算法(方法遞歸結合File類查找文件)

    方法遞歸方法直接調用自己或者間接調用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設計語言中廣泛應用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結合File類查找文件,需要的朋友可以參考下
    2023-02-02
  • mybatis 實現(xiàn)多條update同時執(zhí)行

    mybatis 實現(xiàn)多條update同時執(zhí)行

    這篇文章主要介紹了mybatis 實現(xiàn)多條update同時執(zhí)行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • springboot實現(xiàn)全局異常捕獲的使用示例

    springboot實現(xiàn)全局異常捕獲的使用示例

    任何系統(tǒng),我們不會傻傻的在每一個地方進行異常捕獲和處理,整個系統(tǒng)一般我們會在一個的地方統(tǒng)一進行異常處理,本文主要介紹了springboot實現(xiàn)全局異常捕獲的使用示例,感興趣的可以了解一下
    2023-11-11
  • SpringBoot實現(xiàn)加載yml文件中字典數(shù)據(jù)

    SpringBoot實現(xiàn)加載yml文件中字典數(shù)據(jù)

    這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)加載yml文件中字典數(shù)據(jù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • Springboot中的異步任務執(zhí)行及監(jiān)控詳解

    Springboot中的異步任務執(zhí)行及監(jiān)控詳解

    這篇文章主要介紹了Springboot中的異步任務執(zhí)行及監(jiān)控詳解,除了自己實現(xiàn)線程外,springboot本身就提供了通過注解的方式,進行異步任務的執(zhí)行,下面主要記錄一下,在Springboot項目中實現(xiàn)異步任務,以及對異步任務進行封裝監(jiān)控,需要的朋友可以參考下
    2023-10-10
  • jsp頁面中獲取servlet請求中的參數(shù)的辦法詳解

    jsp頁面中獲取servlet請求中的參數(shù)的辦法詳解

    在JAVA WEB應用中,如何獲取servlet請求中的參數(shù),本文講解了jsp頁面中獲取servlet請求中的參數(shù)的辦法
    2018-03-03
  • Spring的事務管理你了解嗎

    Spring的事務管理你了解嗎

    這篇文章主要為大家介紹了Spring的事務管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

南雄市| 郴州市| 乌拉特后旗| 深泽县| 沅陵县| 华坪县| 马公市| 佛学| 怀仁县| 阿拉善右旗| 太谷县| 正镶白旗| 固阳县| 城步| 长顺县| 会东县| 乳山市| 阳高县| 年辖:市辖区| 巴林左旗| 洛隆县| 武胜县| 芦溪县| 泰顺县| 新津县| 明溪县| 景洪市| 杨浦区| 岐山县| 扎兰屯市| 平武县| 普洱| 大石桥市| 岳池县| 抚顺县| 天柱县| 崇信县| 莱州市| 无极县| 台东市| 高雄县|