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

Spring?Boot實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的解決方案

 更新時間:2025年01月01日 09:09:32   作者:m0_74825488  
文章介紹了在SpringBoot中實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的幾種方案,并詳細(xì)描述了一個使用AbstractRoutingDataSource的實(shí)現(xiàn)步驟,感興趣的朋友一起看看吧

前言

在 Spring Boot 中實(shí)現(xiàn)多數(shù)據(jù)源連接和切換,可以通過以下幾種方案來實(shí)現(xiàn),具體取決于項(xiàng)目的需求、數(shù)據(jù)庫的使用模式和管理的復(fù)雜性。以下是一個常見的多數(shù)據(jù)源切換的實(shí)現(xiàn)方案,使用 AbstractRoutingDataSource 來動態(tài)選擇數(shù)據(jù)源。

一、多數(shù)據(jù)源配置與切換方案

在多數(shù)據(jù)源場景中,通常有如下步驟:

  • 配置多個數(shù)據(jù)源的 DataSource bean。
  • 使用 AbstractRoutingDataSource 來動態(tài)切換數(shù)據(jù)源。
  • 使用 ThreadLocal 存儲當(dāng)前的數(shù)據(jù)庫類型或數(shù)據(jù)源標(biāo)識符。
  • 配置數(shù)據(jù)源切換的邏輯,例如基于當(dāng)前的用戶、請求路徑、服務(wù)標(biāo)識等來選擇不同的數(shù)據(jù)源。

二、實(shí)現(xiàn)步驟

1. 創(chuàng)建多個 DataSource 配置類

首先,為每個數(shù)據(jù)源創(chuàng)建單獨(dú)的配置類,通常你會在 application.ymlapplication.properties 中配置每個數(shù)據(jù)源的連接信息。

spring:
  datasource:
    # 默認(rèn)數(shù)據(jù)源配置
    primary:
      url: jdbc:mysql://localhost:3306/primary_db
      username: root
      password: password
      driver-class-name: com.mysql.cj.jdbc.Driver
      hikari:
        maximum-pool-size: 10
    # 第二數(shù)據(jù)源配置
    secondary:
      url: jdbc:mysql://localhost:3306/secondary_db
      username: root
      password: password
      driver-class-name: com.mysql.cj.jdbc.Driver
      hikari:
        maximum-pool-size: 10

2. 創(chuàng)建 DataSource 配置類

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

3. 創(chuàng)建動態(tài)數(shù)據(jù)源路由類

AbstractRoutingDataSource 允許我們在運(yùn)行時根據(jù)某些條件動態(tài)選擇數(shù)據(jù)源。

@Configuration
public class DynamicDataSourceConfig {
    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;
    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;
    @Bean
    public DataSource dataSource() {
        // 創(chuàng)建一個路由數(shù)據(jù)源
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setDefaultTargetDataSource(primaryDataSource); // 默認(rèn)數(shù)據(jù)源
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("primary", primaryDataSource);
        targetDataSources.put("secondary", secondaryDataSource);
        dataSource.setTargetDataSources(targetDataSources);
        return dataSource;
    }
}

4. 實(shí)現(xiàn) DynamicDataSource

DynamicDataSource 是繼承自 AbstractRoutingDataSource,它通過 determineCurrentLookupKey() 方法來動態(tài)確定當(dāng)前的數(shù)據(jù)源。

public class DynamicDataSource extends AbstractRoutingDataSource {
    // 從 ThreadLocal 獲取當(dāng)前的數(shù)據(jù)庫標(biāo)識
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }
}

5. 創(chuàng)建 DataSourceContextHolder 來存儲當(dāng)前的數(shù)據(jù)源標(biāo)識

使用 ThreadLocal 來保持當(dāng)前線程的數(shù)據(jù)庫標(biāo)識,以便在不同的數(shù)據(jù)源之間切換。

public class DataSourceContextHolder {
    // 使用 ThreadLocal 存儲當(dāng)前線程的數(shù)據(jù)源標(biāo)識
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
    public static void setDataSourceType(String dataSourceType) {
        contextHolder.set(dataSourceType);
    }
    public static String getDataSourceType() {
        return contextHolder.get();
    }
    public static void clearDataSourceType() {
        contextHolder.remove();
    }
}

6. AOP 方式切換數(shù)據(jù)源

為了在運(yùn)行時動態(tài)切換數(shù)據(jù)源,通常會使用 AOP 切面來攔截方法執(zhí)行并指定數(shù)據(jù)源。

@Aspect
@Component
public class DataSourceAspect {
    // 通過注解來指定使用哪個數(shù)據(jù)源
    @Before("@annotation(dataSource)")
    public void switchDataSource(DataSourceType dataSource) {
        // 切換數(shù)據(jù)源
        DataSourceContextHolder.setDataSourceType(dataSource.value());
    }
    @After("@annotation(dataSource)")
    public void clearDataSource(DataSourceType dataSource) {
        // 清理數(shù)據(jù)源標(biāo)識,避免影響其他線程
        DataSourceContextHolder.clearDataSourceType();
    }
}

7. 自定義注解來指定數(shù)據(jù)源

創(chuàng)建一個自定義注解 DataSourceType,用于指定當(dāng)前方法執(zhí)行時需要使用的數(shù)據(jù)源。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceType {
    String value() default "primary";  // 數(shù)據(jù)源標(biāo)識,默認(rèn)使用primary數(shù)據(jù)源
}

8. 在 Service 層使用注解指定數(shù)據(jù)源

在 Service 層,可以使用剛才創(chuàng)建的 @DataSourceType 注解來指定不同的方法使用不同的數(shù)據(jù)源。

@Service
public class UserService {
    @DataSourceType("primary")
    public List<User> getPrimaryUsers() {
        // 查詢主數(shù)據(jù)庫
        return userRepository.findAll();
    }
    @DataSourceType("secondary")
    public List<User> getSecondaryUsers() {
        // 查詢次數(shù)據(jù)庫
        return secondaryUserRepository.findAll();
    }
}

總結(jié)

  • 數(shù)據(jù)源配置:為每個數(shù)據(jù)源配置 DataSource Bean。
  • 動態(tài)數(shù)據(jù)源路由:使用 AbstractRoutingDataSource 來實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源。
  • ThreadLocal存儲:使用 ThreadLocal 存儲和獲取當(dāng)前線程的數(shù)據(jù)源標(biāo)識。
  • AOP切換數(shù)據(jù)源:使用 AOP 來攔截方法并切換數(shù)據(jù)源。
  • 注解方式指定數(shù)據(jù)源:通過自定義注解來指定方法使用的具體數(shù)據(jù)源。

這種方式比較靈活,能夠在運(yùn)行時根據(jù)業(yè)務(wù)需求選擇不同的數(shù)據(jù)源,適用于多數(shù)據(jù)源的場景,尤其是分庫分表、讀寫分離等復(fù)雜應(yīng)用場景。

到此這篇關(guān)于Spring Boot實(shí)現(xiàn)多數(shù)據(jù)源連接和切換的文章就介紹到這了,更多相關(guān)Spring Boot多數(shù)據(jù)源連接和切換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springmvc接收參數(shù)為日期類型詳解

    springmvc接收參數(shù)為日期類型詳解

    這篇文章主要介紹了springmvc接收參數(shù)為日期類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java進(jìn)程CPU使用率過高排查步驟詳細(xì)講解

    Java進(jìn)程CPU使用率過高排查步驟詳細(xì)講解

    這篇文章主要介紹了Java進(jìn)程CPU使用率過高排查的相關(guān)資料,針對Java進(jìn)程CPU使用率高的問題,我們可以遵循以下步驟進(jìn)行排查和優(yōu)化,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Java使用pdfbox實(shí)現(xiàn)給pdf文件加圖片水印

    Java使用pdfbox實(shí)現(xiàn)給pdf文件加圖片水印

    有時候需要給pdf加水印,市面上工具都是收費(fèi)的要會員,還是自食其力吧;嘗試過 spire.pdf.free 那個超過10頁就不行了!所以本文還是使用了pdfbox,感興趣的可以了解一下
    2022-11-11
  • Mybatis 中的一對一,一對多,多對多的配置原則示例代碼

    Mybatis 中的一對一,一對多,多對多的配置原則示例代碼

    這篇文章主要介紹了 Mybatis 中的一對一,一對多,多對多的配置原則示例代碼,需要的朋友可以參考下
    2017-03-03
  • Java redis存Map對象類型數(shù)據(jù)的實(shí)現(xiàn)

    Java redis存Map對象類型數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Java redis存Map<String,RedisCustom>對象類型數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 理解 MyBatis 是如何在 Spring 容器中初始化的

    理解 MyBatis 是如何在 Spring 容器中初始化的

    這篇文章主要介紹了理解 MyBatis 是如何在 Spring 容器中初始化的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • screw?Maven插件方式運(yùn)行時在編譯打包時跳過執(zhí)行的問題解決方法

    screw?Maven插件方式運(yùn)行時在編譯打包時跳過執(zhí)行的問題解決方法

    這篇文章主要介紹了screw?Maven插件方式運(yùn)行時在編譯打包時跳過執(zhí)行的問題解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java集合框架Set&Map詳細(xì)解析

    Java集合框架Set&Map詳細(xì)解析

    這篇文章介紹了Java集合框架中的Map和Set接口,Map接口用于存儲鍵值對,常用實(shí)現(xiàn)類有HashMap、LinkedHashMap和TreeMap,Set接口用于存儲唯一元素,常用實(shí)現(xiàn)類有HashSet、LinkedHashSet和TreeSet,每種實(shí)現(xiàn)類都有其特點(diǎn)和適用場景,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Spring的RedisTemplate存儲的key和value有特殊字符的處理

    Spring的RedisTemplate存儲的key和value有特殊字符的處理

    這篇文章主要介紹了Spring的RedisTemplate存儲的key和value有特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot整合JPA過程解析

    springboot整合JPA過程解析

    這篇文章主要介紹了springboot整合JPA過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

安多县| 岗巴县| 治多县| 手机| 保康县| 花莲县| 通许县| 台中市| 蒙城县| 郓城县| 佛坪县| 宿迁市| 灵丘县| 彩票| 布尔津县| 仲巴县| 什邡市| 株洲县| 洛川县| 昌邑市| 大渡口区| 淮北市| 板桥市| 湟中县| 昔阳县| 安宁市| 仪征市| 浪卡子县| 大方县| 广丰县| 隆子县| 宿松县| 河北省| 浦城县| 隆德县| 农安县| 武山县| 连平县| 信丰县| 洪江市| 贡嘎县|