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

在SpringBoot項目中動態(tài)切換數(shù)據(jù)源和數(shù)據(jù)庫的詳細(xì)步驟

 更新時間:2025年08月06日 09:46:44   作者:喵手  
在許多企業(yè)級應(yīng)用中,可能需要根據(jù)不同的業(yè)務(wù)需求來切換不同的數(shù)據(jù)庫,如讀寫分離、分庫分表等場景,Spring Boot 提供了靈活的數(shù)據(jù)源配置方式,本文將介紹如何在 Spring Boot 項目中實現(xiàn)動態(tài)切換數(shù)據(jù)源和數(shù)據(jù)庫的方案,需要的朋友可以參考下

前言

在許多企業(yè)級應(yīng)用中,可能需要根據(jù)不同的業(yè)務(wù)需求來切換不同的數(shù)據(jù)庫,如讀寫分離、分庫分表等場景。Spring Boot 提供了靈活的數(shù)據(jù)源配置方式,可以通過動態(tài)切換數(shù)據(jù)源來實現(xiàn)這些需求。

本文將介紹如何在 Spring Boot 項目中實現(xiàn)動態(tài)切換數(shù)據(jù)源和數(shù)據(jù)庫的方案。我們將使用 Spring 的 AbstractRoutingDataSource 來實現(xiàn)動態(tài)切換數(shù)據(jù)源。

步驟一:引入依賴

首先,確保 Spring Boot 項目引入了以下依賴,主要包括 Spring Data JPA 和 MySQL 驅(qū)動(如果使用 MySQL 數(shù)據(jù)庫)。在 pom.xml 文件中添加這些依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId> <!-- 使用 HikariCP 作為連接池 -->
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

步驟二:配置多個數(shù)據(jù)源

application.propertiesapplication.yml 中配置多個數(shù)據(jù)源,假設(shè)我們配置了主數(shù)據(jù)源和從數(shù)據(jù)源。

application.properties 示例:

# 主數(shù)據(jù)源配置
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db
spring.datasource.primary.username=root
spring.datasource.primary.password=root_password
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.primary.hikari.maximum-pool-size=10

# 從數(shù)據(jù)源配置
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root_password
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.hikari.maximum-pool-size=10

步驟三:自定義動態(tài)數(shù)據(jù)源

Spring Boot 默認(rèn)的配置是固定的單一數(shù)據(jù)源,但我們可以通過自定義 AbstractRoutingDataSource 來實現(xiàn)動態(tài)數(shù)據(jù)源切換。

1. 自定義 DynamicDataSource 類

AbstractRoutingDataSource 是 Spring 提供的一個用于路由到不同數(shù)據(jù)源的抽象類,我們繼承該類并重寫 determineCurrentLookupKey() 方法,根據(jù)當(dāng)前線程或請求上下文來決定使用哪個數(shù)據(jù)源。

public class DynamicDataSource extends AbstractRoutingDataSource {

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

2. 定義 DataSourceContextHolder 類

為了實現(xiàn)線程安全地存儲當(dāng)前數(shù)據(jù)源的上下文,我們使用 ThreadLocal 來保存當(dāng)前線程的數(shù)據(jù)源標(biāo)識。

public class DataSourceContextHolder {

    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();
    }
}

3. 配置動態(tài)數(shù)據(jù)源

在配置類中,將多個數(shù)據(jù)源(如主數(shù)據(jù)庫和從數(shù)據(jù)庫)與 DynamicDataSource 關(guān)聯(lián),并將 DynamicDataSource 設(shè)置為 Spring 管理的數(shù)據(jù)源。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.repository")
public class DataSourceConfig {

    @Primary
    @Bean
    public DynamicDataSource dynamicDataSource(
        @Qualifier("primaryDataSource") DataSource primaryDataSource,
        @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("primary", primaryDataSource);
        targetDataSources.put("secondary", secondaryDataSource);

        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setDefaultTargetDataSource(primaryDataSource);
        dynamicDataSource.setTargetDataSources(targetDataSources);
        return dynamicDataSource;
    }

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

步驟四:切換數(shù)據(jù)源

為了動態(tài)切換數(shù)據(jù)源,我們可以在需要切換數(shù)據(jù)源的地方設(shè)置數(shù)據(jù)源類型(如讀寫分離、業(yè)務(wù)模塊分庫等)。

1. 在服務(wù)層切換數(shù)據(jù)源

在服務(wù)方法中,我們可以通過 DataSourceContextHolder.setDataSourceType("primary")DataSourceContextHolder.setDataSourceType("secondary") 來切換數(shù)據(jù)源。

@Service
public class DataService {

    // 使用主數(shù)據(jù)源
    public void usePrimaryDataSource() {
        DataSourceContextHolder.setDataSourceType("primary");
        // 執(zhí)行主數(shù)據(jù)庫相關(guān)操作
    }

    // 使用從數(shù)據(jù)源
    public void useSecondaryDataSource() {
        DataSourceContextHolder.setDataSourceType("secondary");
        // 執(zhí)行從數(shù)據(jù)庫相關(guān)操作
    }

    // 清除數(shù)據(jù)源設(shè)置
    public void clearDataSource() {
        DataSourceContextHolder.clearDataSourceType();
    }
}

2. 在控制器層切換數(shù)據(jù)源

在控制器層中,可以根據(jù)請求的不同選擇使用不同的數(shù)據(jù)源。

@RestController
@RequestMapping("/data")
public class DataController {

    @Autowired
    private DataService dataService;

    @GetMapping("/usePrimary")
    public String usePrimaryDataSource() {
        dataService.usePrimaryDataSource();
        return "Using Primary DataSource";
    }

    @GetMapping("/useSecondary")
    public String useSecondaryDataSource() {
        dataService.useSecondaryDataSource();
        return "Using Secondary DataSource";
    }
}

步驟五:使用AOP統(tǒng)一切換數(shù)據(jù)源

為了更優(yōu)雅地切換數(shù)據(jù)源并解耦,我們可以通過 AOP(面向切面編程)來統(tǒng)一處理數(shù)據(jù)源切換。我們可以創(chuàng)建一個自定義注解來標(biāo)識哪些方法需要切換數(shù)據(jù)源。

1. 自定義注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceSwitch {
    String value() default "primary"; // 默認(rèn)使用主數(shù)據(jù)源
}

2. 切面類實現(xiàn)

創(chuàng)建切面類,在方法執(zhí)行前根據(jù)注解指定的數(shù)據(jù)源值來切換數(shù)據(jù)源。

@Aspect
@Component
public class DataSourceAspect {

    @Before("@annotation(dataSourceSwitch)")
    public void switchDataSource(DataSourceSwitch dataSourceSwitch) {
        String dataSourceType = dataSourceSwitch.value();
        DataSourceContextHolder.setDataSourceType(dataSourceType);
    }

    @After("@annotation(dataSourceSwitch)")
    public void clearDataSource(DataSourceSwitch dataSourceSwitch) {
        DataSourceContextHolder.clearDataSourceType();
    }
}

3. 使用注解切換數(shù)據(jù)源

@Service
public class DataService {

    @DataSourceSwitch("primary")
    public void usePrimaryDataSource() {
        // 使用主數(shù)據(jù)源
    }

    @DataSourceSwitch("secondary")
    public void useSecondaryDataSource() {
        // 使用從數(shù)據(jù)源
    }
}

總結(jié)

通過在 Spring Boot 中實現(xiàn)動態(tài)數(shù)據(jù)源切換,我們可以靈活地管理不同數(shù)據(jù)庫的使用,滿足不同業(yè)務(wù)場景的需求。無論是簡單的讀寫分離、分庫還是更復(fù)雜的業(yè)務(wù)需求,都可以通過動態(tài)切換數(shù)據(jù)源來完成。通過結(jié)合 AOP 和注解,我們可以更加優(yōu)雅地管理和切換數(shù)據(jù)源,避免了硬編碼和重復(fù)代碼的情況,提升了代碼的可維護(hù)性和擴(kuò)展性。

以上就是在SpringBoot項目中動態(tài)切換數(shù)據(jù)源和數(shù)據(jù)庫的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot動態(tài)切換數(shù)據(jù)源和數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    這篇文章主要介紹了MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程,需要的朋友可以參考下
    2020-08-08
  • 最新評論

    玉林市| 台东县| 广宗县| 台中县| 高邑县| 花莲县| 茶陵县| 临城县| 华坪县| 明光市| 临城县| 界首市| 黎平县| 兴山县| 平远县| 中江县| 无棣县| 申扎县| 增城市| 霞浦县| 鄯善县| 松江区| 南投县| 东乡县| 壤塘县| 亚东县| 吴江市| 彭泽县| 蒲江县| 商洛市| 尚志市| 翁牛特旗| 陆河县| 济南市| 台前县| 皮山县| 沙洋县| 上杭县| 泌阳县| 金湖县| 同德县|