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

springboot多數(shù)據(jù)源實(shí)現(xiàn)方式

 更新時(shí)間:2025年01月11日 10:37:24   作者:CC大煊  
本文介紹了多數(shù)據(jù)源配置的重要性以及在SpringBoot中如何配置單個(gè)默認(rèn)數(shù)據(jù)源和多個(gè)數(shù)據(jù)源,此外,還討論了如何整合MyBatis、實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源路由、事務(wù)管理以及使用dynamic-datasource-spring-boot-starter框架來(lái)簡(jiǎn)化多數(shù)據(jù)源管理

1. 引言:多數(shù)據(jù)源的必要性和應(yīng)用場(chǎng)景

在現(xiàn)代軟件開(kāi)發(fā)中,隨著業(yè)務(wù)的復(fù)雜性增加和數(shù)據(jù)量的急劇膨脹,一個(gè)應(yīng)用可能需要同時(shí)訪問(wèn)多種數(shù)據(jù)庫(kù)來(lái)滿(mǎn)足不同的數(shù)據(jù)處理需求。

例如,一個(gè)電子商務(wù)系統(tǒng)可能需要一個(gè)數(shù)據(jù)庫(kù)來(lái)處理交易數(shù)據(jù),另一個(gè)數(shù)據(jù)庫(kù)來(lái)分析用戶(hù)行為。這就是多數(shù)據(jù)源配置的必要性所在。

為什么需要多數(shù)據(jù)源?

  1. 業(yè)務(wù)邏輯分離:不同的數(shù)據(jù)庫(kù)可以承載不同的業(yè)務(wù)模塊,例如,訂單處理和用戶(hù)分析可以分別在不同的數(shù)據(jù)庫(kù)中進(jìn)行,使得業(yè)務(wù)更加清晰,同時(shí)提高系統(tǒng)的可維護(hù)性。
  2. 性能優(yōu)化:通過(guò)分散請(qǐng)求到專(zhuān)門(mén)的數(shù)據(jù)庫(kù),可以避免單一數(shù)據(jù)庫(kù)因請(qǐng)求過(guò)多而成為性能瓶頸,從而提高整個(gè)應(yīng)用的性能。
  3. 數(shù)據(jù)安全和隔離:敏感數(shù)據(jù)可以單獨(dú)存儲(chǔ)在更加安全的數(shù)據(jù)庫(kù)中,普通數(shù)據(jù)則可以在常規(guī)安全級(jí)別的數(shù)據(jù)庫(kù)中處理,從而提高數(shù)據(jù)安全性。
  4. 技術(shù)多樣性:不同的數(shù)據(jù)庫(kù)技術(shù)(如關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù))有其特定優(yōu)勢(shì),多數(shù)據(jù)源配置允許在一個(gè)項(xiàng)目中利用各種數(shù)據(jù)庫(kù)技術(shù)的優(yōu)勢(shì)。

應(yīng)用場(chǎng)景

  1. 大數(shù)據(jù)分析與實(shí)時(shí)業(yè)務(wù)系統(tǒng)并行:在很多企業(yè)級(jí)應(yīng)用中,通常需要將實(shí)時(shí)業(yè)務(wù)數(shù)據(jù)庫(kù)和大數(shù)據(jù)分析數(shù)據(jù)庫(kù)分開(kāi)管理,以免復(fù)雜的數(shù)據(jù)分析操作影響到核心業(yè)務(wù)系統(tǒng)的性能。
  2. 微服務(wù)架構(gòu):在微服務(wù)架構(gòu)中,各個(gè)微服務(wù)可能需要獨(dú)立的數(shù)據(jù)庫(kù)實(shí)例,以保持服務(wù)的自治性和解耦。
  3. 遺留系統(tǒng)整合:在新舊系統(tǒng)整合過(guò)程中,可能需要同時(shí)接入新舊系統(tǒng)的數(shù)據(jù)庫(kù),以保證數(shù)據(jù)的完整性和一致性。
  4. 跨地域數(shù)據(jù)處理:全球化業(yè)務(wù)可能需要在不同地域部署數(shù)據(jù)庫(kù),以減少數(shù)據(jù)訪問(wèn)延遲和符合地域數(shù)據(jù)法規(guī)。

通過(guò)這些場(chǎng)景,我們可以看出,多數(shù)據(jù)源的配置不僅是一種技術(shù)需求,更是業(yè)務(wù)發(fā)展和數(shù)據(jù)管理策略的一部分。

2. Spring Boot中的數(shù)據(jù)源配置

Spring Boot極大地簡(jiǎn)化了Java應(yīng)用的數(shù)據(jù)庫(kù)連接和操作。它通過(guò)自動(dòng)配置支持快速啟動(dòng)和運(yùn)行,但在處理多數(shù)據(jù)源時(shí),需要進(jìn)行一些額外的配置。

以下是如何在Spring Boot中配置單個(gè)默認(rèn)數(shù)據(jù)源以及如何擴(kuò)展到多數(shù)據(jù)源的詳細(xì)說(shuō)明。

2.1 默認(rèn)數(shù)據(jù)源配置簡(jiǎn)介

在Spring Boot中,配置一個(gè)默認(rèn)的數(shù)據(jù)源非常簡(jiǎn)單。你只需要在application.propertiesapplication.yml文件中添加相關(guān)的數(shù)據(jù)庫(kù)連接配置即可。Spring Boot使用這些屬性自動(dòng)配置數(shù)據(jù)源和JPA或JDBC模板。

示例 - application.properties配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=mypass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

這些配置告訴Spring Boot如何連接到數(shù)據(jù)庫(kù),并使用哪個(gè)JDBC驅(qū)動(dòng)。Spring Boot支持大多數(shù)主流數(shù)據(jù)庫(kù),并自動(dòng)配置連接池(默認(rèn)是HikariCP)。

2.2 如何在Spring Boot中配置多個(gè)數(shù)據(jù)源

配置多個(gè)數(shù)據(jù)源需要更多的手動(dòng)設(shè)置。你需要定義每個(gè)數(shù)據(jù)源的配置,并確保Spring Boot能夠正確地區(qū)分和管理它們。以下是配置多數(shù)據(jù)源的步驟:

步驟 1: 定義數(shù)據(jù)源配置

首先,你需要在配置文件中為每個(gè)數(shù)據(jù)源定義不同的前綴。例如:

# 主數(shù)據(jù)源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver

# 輔助數(shù)據(jù)源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

步驟 2: 創(chuàng)建數(shù)據(jù)源配置類(lèi)

你需要?jiǎng)?chuàng)建配置類(lèi)來(lái)加載和區(qū)分這些數(shù)據(jù)源。每個(gè)數(shù)據(jù)源都應(yīng)該有自己的配置類(lèi)和@Bean定義。

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

在這個(gè)配置中,@Primary注解標(biāo)記了主數(shù)據(jù)源,這意味著如果有多個(gè)數(shù)據(jù)源可用,Spring Boot會(huì)默認(rèn)使用標(biāo)記為@Primary的數(shù)據(jù)源。

步驟 3: 配置JdbcTemplate或EntityManager

對(duì)于每個(gè)數(shù)據(jù)源,你可能需要配置一個(gè)JdbcTemplateEntityManager以便于操作數(shù)據(jù)庫(kù)。

@Bean
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

@Bean
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

通過(guò)以上步驟,你可以在Spring Boot應(yīng)用中配置并使用多個(gè)數(shù)據(jù)源。這種配置方式不僅可以滿(mǎn)足復(fù)雜的業(yè)務(wù)需求,還可以幫助你更好地管理和維護(hù)不同的數(shù)據(jù)環(huán)境。

3. 整合MyBatis與多數(shù)據(jù)源

MyBatis 是一個(gè)流行的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。在 Spring Boot 應(yīng)用中整合 MyBatis 用于多數(shù)據(jù)源管理,需要一些特定的配置來(lái)確保每個(gè)數(shù)據(jù)源正確地與對(duì)應(yīng)的 SQL 映射和事務(wù)管理器綁定。

配置MyBatis使用多數(shù)據(jù)源

要配置 MyBatis 使用多個(gè)數(shù)據(jù)源,你需要定義每個(gè)數(shù)據(jù)源的 SqlSessionFactoryTransactionManager。這確保了 MyBatis 能夠?yàn)槊總€(gè)數(shù)據(jù)庫(kù)連接提供獨(dú)立的會(huì)話和事務(wù)控制。

  1. 定義數(shù)據(jù)源:如之前所述,定義多個(gè)數(shù)據(jù)源。
  2. 創(chuàng)建 SqlSessionFactory:為每個(gè)數(shù)據(jù)源創(chuàng)建一個(gè) SqlSessionFactory,這是 MyBatis 的核心組件,用于管理 MyBatis 的所有 SQL 操作。
  3. 配置 TransactionManager:為每個(gè)數(shù)據(jù)源配置一個(gè)事務(wù)管理器,確保事務(wù)的正確管理。
@Configuration
public class MyBatisConfig {

    @Bean
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

Mapper接口的數(shù)據(jù)源指定

在定義了不同的 SqlSessionFactory 后,需要指定每個(gè) Mapper 接口或 XML 映射文件應(yīng)該使用哪個(gè)數(shù)據(jù)源。這通常通過(guò)在 Mapper 接口上使用特定的注解或通過(guò)配置來(lái)實(shí)現(xiàn)。

  1. 使用@MapperScan注解指定數(shù)據(jù)源:可以在配置類(lèi)中使用 @MapperScan 注解為不同的包指定不同的 SqlSessionFactory
@Configuration
@MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
    // Primary data source configuration
}

@Configuration
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
    // Secondary data source configuration
}

通過(guò)這種方式,你可以確保每個(gè)數(shù)據(jù)源的 Mapper 接口只會(huì)與指定的 SqlSessionFactory 交互,從而實(shí)現(xiàn)真正意義上的數(shù)據(jù)源隔離。這樣的配置使得管理大型項(xiàng)目中的多數(shù)據(jù)源更加靈活和高效。

4. 數(shù)據(jù)源的動(dòng)態(tài)路由

在多數(shù)據(jù)源的環(huán)境中,動(dòng)態(tài)數(shù)據(jù)源路由成為一種強(qiáng)大的策略,允許應(yīng)用程序在運(yùn)行時(shí)根據(jù)特定的邏輯或條件選擇不同的數(shù)據(jù)庫(kù)。這對(duì)于需要根據(jù)用戶(hù)請(qǐng)求、事務(wù)特性或其他業(yè)務(wù)邏輯動(dòng)態(tài)切換數(shù)據(jù)源的應(yīng)用尤其有用。

4.1 什么是數(shù)據(jù)源路由?

數(shù)據(jù)源路由是一種機(jī)制,它根據(jù)一定的規(guī)則動(dòng)態(tài)地決定數(shù)據(jù)庫(kù)操作應(yīng)該走哪個(gè)數(shù)據(jù)源。例如,在一個(gè)多租戶(hù)系統(tǒng)中,每個(gè)租戶(hù)可能有自己的數(shù)據(jù)庫(kù),系統(tǒng)需要根據(jù)當(dāng)前用戶(hù)的租戶(hù)信息動(dòng)態(tài)切換到相應(yīng)的數(shù)據(jù)庫(kù)。

4.2 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)數(shù)據(jù)源路由

為了實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源路由,我們通常需要?jiǎng)?chuàng)建一個(gè)動(dòng)態(tài)數(shù)據(jù)源路由器,這個(gè)路由器繼承自AbstractRoutingDataSource,并重寫(xiě)determineCurrentLookupKey()方法來(lái)決定使用哪個(gè)數(shù)據(jù)源鍵。

以下是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)示例:

1. 定義動(dòng)態(tài)數(shù)據(jù)源類(lèi)

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // DynamicDataSourceContextHolder用于持有當(dāng)前線程使用的數(shù)據(jù)源標(biāo)識(shí)
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}

2. 配置動(dòng)態(tài)數(shù)據(jù)源

在Spring配置文件中,你需要配置DynamicDataSource作為數(shù)據(jù)源,并指定實(shí)際的數(shù)據(jù)源映射。

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        // 設(shè)置默認(rèn)數(shù)據(jù)源
        dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());
        // 配置多數(shù)據(jù)源
        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put("primary", primaryDataSource());
        dataSourceMap.put("secondary", secondaryDataSource());
        dynamicDataSource.setTargetDataSources(dataSourceMap);
        
        return dynamicDataSource;
    }

    @Bean
    public DataSource primaryDataSource() {
        return new HikariDataSource(); // 配置主數(shù)據(jù)源
    }

    @Bean
    public DataSource secondaryDataSource() {
        return new HikariDataSource(); // 配置次級(jí)數(shù)據(jù)源
    }
}

3. 使用@Transactional指定數(shù)據(jù)源

在服務(wù)或數(shù)據(jù)訪問(wèn)層,你可以通過(guò)指定@Transactional注解的value屬性來(lái)選擇特定的數(shù)據(jù)源。

@Service
public class UserService {

    @Transactional(value = "primaryTransactionManager")
    public void addUser(User user) {
        // 使用主數(shù)據(jù)源添加用戶(hù)
    }

    @Transactional(value = "secondaryTransactionManager")
    public User findUser(String username) {
        // 使用次級(jí)數(shù)據(jù)源查找用戶(hù)
    }
}

這樣的設(shè)置允許應(yīng)用在運(yùn)行時(shí)根據(jù)業(yè)務(wù)需求靈活選擇合適的數(shù)據(jù)源,從而實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)操作策略和更高的數(shù)據(jù)操作靈活性。

5. 事務(wù)管理配置

在處理多數(shù)據(jù)源時(shí),事務(wù)管理變得尤為重要,因?yàn)椴划?dāng)?shù)氖聞?wù)處理可能導(dǎo)致數(shù)據(jù)不一致和其他嚴(yán)重問(wèn)題。在Spring Boot應(yīng)用中,正確配置和管理多數(shù)據(jù)源下的事務(wù)是確保數(shù)據(jù)完整性和一致性的關(guān)鍵。

如何管理多數(shù)據(jù)源下的事務(wù)

局部事務(wù)

  • 局部事務(wù)是最簡(jiǎn)單的事務(wù)類(lèi)型,它僅涉及單一數(shù)據(jù)源。
  • 在Spring Boot中,你可以為每個(gè)數(shù)據(jù)源配置一個(gè)事務(wù)管理器。
  • 然后,你可以在服務(wù)層使用@Transactional注解來(lái)指定使用哪個(gè)事務(wù)管理器。

示例配置事務(wù)管理器:

@Bean
public DataSourceTransactionManager transactionManager1(DataSource dataSource1) {
    return new DataSourceTransactionManager(dataSource1);
}

@Bean
public DataSourceTransactionManager transactionManager2(DataSource dataSource2) {
    return new DataSourceTransactionManager(dataSource2);
}

使用指定的事務(wù)管理器:

@Transactional(transactionManager = "transactionManager1")
public void someDataServiceMethod() {
    // 業(yè)務(wù)邏輯
}

全局事務(wù)

  • 全局事務(wù)(也稱(chēng)為分布式事務(wù))涉及多個(gè)數(shù)據(jù)源或服務(wù)。
  • 在Spring Boot中,可以使用JTA(Java Transaction API)來(lái)配置全局事務(wù)管理器,如Atomikos或Bitronix。

配置全局事務(wù)管理器(使用Atomikos為例):

@Bean(initMethod = "init", destroyMethod = "close")
public UserTransactionManager atomikosTransactionManager() throws Throwable {
    UserTransactionManager userTransactionManager = new UserTransactionManager();
    userTransactionManager.setForceShutdown(false);
    return userTransactionManager;
}

@Bean
public JtaTransactionManager transactionManager(UserTransactionManager userTransactionManager) {
    JtaTransactionManager transactionManager = new JtaTransactionManager();
    transactionManager.setTransactionManager(userTransactionManager);
    transactionManager.setUserTransaction(userTransactionManager);
    return transactionManager;
}

在服務(wù)層使用全局事務(wù)管理器:

@Transactional
public void someDataServiceMethod() {
    // 業(yè)務(wù)邏輯涉及多個(gè)數(shù)據(jù)源
}

配置全局事務(wù)和局部事務(wù)

在配置事務(wù)管理時(shí),你需要決定每個(gè)業(yè)務(wù)場(chǎng)景適合使用局部事務(wù)還是全局事務(wù)。局部事務(wù)簡(jiǎn)單且性能較好,適用于單一數(shù)據(jù)源操作。全局事務(wù)適用于需要跨多個(gè)數(shù)據(jù)庫(kù)或服務(wù)的操作,但可能會(huì)帶來(lái)更高的性能開(kāi)銷(xiāo)。

確保在配置和使用事務(wù)時(shí),明確區(qū)分不同的事務(wù)管理器,特別是在使用@Transactional注解時(shí)指定正確的管理器,以避免事務(wù)管理混亂導(dǎo)致的數(shù)據(jù)問(wèn)題。

6. 實(shí)戰(zhàn)示例:完整的多數(shù)據(jù)源配置示例

在這個(gè)部分,我們將通過(guò)一個(gè)實(shí)際的示例來(lái)展示如何在Spring Boot應(yīng)用中配置和使用多個(gè)數(shù)據(jù)源。這個(gè)示例將包括配置文件、數(shù)據(jù)源配置、MyBatis集成、以及動(dòng)態(tài)數(shù)據(jù)源的實(shí)現(xiàn)。

示例概述

假設(shè)我們有一個(gè)應(yīng)用需要同時(shí)訪問(wèn)兩個(gè)數(shù)據(jù)庫(kù):一個(gè)是主數(shù)據(jù)庫(kù)(用于日常業(yè)務(wù)操作),另一個(gè)是審計(jì)數(shù)據(jù)庫(kù)(用于記錄審計(jì)日志)。我們將使用MySQL作為數(shù)據(jù)庫(kù)。

步驟 1: 添加依賴(lài)

首先,在pom.xml中添加必要的依賴(lài):

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.4</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

步驟 2: 配置數(shù)據(jù)源

application.yml中配置兩個(gè)數(shù)據(jù)源:

spring:
  datasource:
    primary:
      jdbc-url: jdbc:mysql://localhost:3306/business_db
      username: user1
      password: pass1
      driver-class-name: com.mysql.cj.jdbc.Driver
    audit:
      jdbc-url: jdbc:mysql://localhost:3306/audit_db
      username: user2
      password: pass2
      driver-class-name: com.mysql.cj.jdbc.Driver

步驟 3: 配置數(shù)據(jù)源 Bean 和 MyBatis

在Spring配置類(lèi)中配置兩個(gè)數(shù)據(jù)源和對(duì)應(yīng)的SqlSessionFactory

@Configuration
public class DataSourceConfig {

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

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

    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }

    @Bean(name = "auditSqlSessionFactory")
    public SqlSessionFactory auditSqlSessionFactory(@Qualifier("auditDataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }
}

步驟 4: 動(dòng)態(tài)數(shù)據(jù)源路由

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)數(shù)據(jù)源路由可以通過(guò)擴(kuò)展AbstractRoutingDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContext.getCurrentDataSource();
    }
}

這里的DataSourceContext是一個(gè)管理數(shù)據(jù)源鍵(比如線程本地變量)的工具類(lèi),它決定了當(dāng)前線程應(yīng)該使用哪個(gè)數(shù)據(jù)源。

步驟 5: 配置和使用

最后,你需要在業(yè)務(wù)邏輯中根據(jù)需要切換數(shù)據(jù)源。這通常是通過(guò)在服務(wù)層方法上使用注解或直接調(diào)用DataSourceContext來(lái)設(shè)置數(shù)據(jù)源。

這個(gè)示例提供了多數(shù)據(jù)源配置的基本框架,你可以根據(jù)實(shí)際需求調(diào)整和擴(kuò)展,例如添加事務(wù)管理器配置、優(yōu)化連接池設(shè)置等。

7. 簡(jiǎn)化多數(shù)據(jù)源管理-dynamic

dynamic-datasource-spring-boot-starter 是一個(gè)用于 Spring Boot 應(yīng)用的數(shù)據(jù)源管理框架。它不僅是一個(gè)簡(jiǎn)單的組件,而是一個(gè)完整的解決方案,旨在簡(jiǎn)化多數(shù)據(jù)源的配置和管理。這個(gè)框架提供了在運(yùn)行時(shí)動(dòng)態(tài)切換數(shù)據(jù)源的能力,這對(duì)于需要連接到多個(gè)數(shù)據(jù)庫(kù)的應(yīng)用程序來(lái)說(shuō)非常有用,特別是在需要實(shí)現(xiàn)讀寫(xiě)分離或連接到不同類(lèi)型數(shù)據(jù)庫(kù)的場(chǎng)景中。

功能和特點(diǎn)

dynamic-datasource-spring-boot-starter 的主要功能和特點(diǎn)包括:

  1. 簡(jiǎn)化多數(shù)據(jù)源配置:通過(guò)在 Spring Boot 應(yīng)用的配置文件中聲明多個(gè)數(shù)據(jù)源,使得配置變得簡(jiǎn)單直觀。
  2. 動(dòng)態(tài)數(shù)據(jù)源切換:提供了基于方法或類(lèi)的注解(如 @DS),允許開(kāi)發(fā)者輕松指定哪個(gè)數(shù)據(jù)源應(yīng)該被用于特定的操作。
  3. 靈活的數(shù)據(jù)源路由:支持基于業(yè)務(wù)邏輯動(dòng)態(tài)選擇數(shù)據(jù)源,例如根據(jù)用戶(hù)的請(qǐng)求參數(shù)或其他邏輯來(lái)切換數(shù)據(jù)源。
  4. 支持主從復(fù)制:非常適合實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離,提高數(shù)據(jù)庫(kù)操作的效率和性能。
  5. 與 Spring 生態(tài)系統(tǒng)的集成:與 Spring Boot 和 Spring Data JPA 等其他 Spring 組件良好集成,使得它可以無(wú)縫地與現(xiàn)有的 Spring 應(yīng)用協(xié)同工作。

應(yīng)用場(chǎng)景

  • 讀寫(xiě)分離:在需要處理大量讀操作和相對(duì)較少的寫(xiě)操作的應(yīng)用中,可以將讀操作指向從數(shù)據(jù)庫(kù),而寫(xiě)操作指向主數(shù)據(jù)庫(kù)。
  • 性能和可用性:通過(guò)分散請(qǐng)求到多個(gè)數(shù)據(jù)源,可以提高應(yīng)用的響應(yīng)時(shí)間和整體性能。
  • 數(shù)據(jù)隔離:在多租戶(hù)系統(tǒng)中,每個(gè)租戶(hù)可能需要獨(dú)立的數(shù)據(jù)庫(kù)。使用 dynamic-datasource-spring-boot-starter 可以輕松管理每個(gè)租戶(hù)的數(shù)據(jù)源。

總之,dynamic-datasource-spring-boot-starter 是一個(gè)功能強(qiáng)大的多數(shù)據(jù)源管理框架,非常適用于需要高度靈活性和強(qiáng)大數(shù)據(jù)源管理功能的復(fù)雜應(yīng)用程序。它通過(guò)簡(jiǎn)化配置和增加運(yùn)行時(shí)數(shù)據(jù)源切換的能力,極大地提高了開(kāi)發(fā)效率和應(yīng)用性能。

引入依賴(lài)

首先,確保你的 Spring Boot 項(xiàng)目中已經(jīng)添加了 dynamic-datasource-spring-boot-starter 的依賴(lài)。如果還沒(méi)有添加,可以在 pom.xml 中加入以下依賴(lài):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>版本</version>
</dependency>

版本根據(jù)實(shí)際項(xiàng)目的依賴(lài)版本選擇

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

application.ymlapplication.properties 文件中配置多個(gè)數(shù)據(jù)源。例如,使用 YAML 格式配置如下:

spring:
  datasource:
    dynamic:
      primary: master # 設(shè)置主數(shù)據(jù)源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/master_db
          username: root
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3306/slave_db
          username: root
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver

使用 @DS 注解

@DS 是一個(gè)用于多數(shù)據(jù)源分離的注解,提供了在同一個(gè)應(yīng)用中同時(shí)使用多個(gè)數(shù)據(jù)源的能力。這個(gè)注解屬于 dynamic-datasource-spring-boot-starter 庫(kù),用于在 Spring Boot 應(yīng)用中動(dòng)態(tài)管理多個(gè)數(shù)據(jù)源。下面是關(guān)于如何使用 @DS 注解的一些基本信息和示例。

在方法上使用

import com.baomidou.dynamic.datasource.annotation.DS;

@Service
public class SomeService {

    @DS("master")
    public void writeToMaster() {
        // 這里的操作會(huì)使用配置中的 master 數(shù)據(jù)源
    }

    @DS("slave")
    public void readFromSlave() {
        // 這里的操作會(huì)使用配置中的 slave 數(shù)據(jù)源
    }
}

在類(lèi)上使用

如果一個(gè)類(lèi)中的所有方法都應(yīng)該使用同一個(gè)數(shù)據(jù)源,可以將 @DS 注解放在類(lèi)級(jí)別:

import com.baomidou.dynamic.datasource.annotation.DS;

@DS("slave")
@Service
public class ReadOnlyService {
    // 所有方法都將使用 slave 數(shù)據(jù)源
    public void queryData() {
        // ...
    }
}

注意事項(xiàng)

  • 確保數(shù)據(jù)源的鍵(如 masterslave)與你在配置文件中定義的名稱(chēng)相匹配。
  • 使用 @DS 注解時(shí),動(dòng)態(tài)數(shù)據(jù)源會(huì)在方法調(diào)用前切換到指定的數(shù)據(jù)源,并在方法執(zhí)行完畢后切換回原來(lái)的數(shù)據(jù)源。
  • 考慮事務(wù)管理的策略,特別是在使用多數(shù)據(jù)源時(shí),可能需要配置多個(gè)事務(wù)管理器。

通過(guò)這種方式,@DS 注解為處理多數(shù)據(jù)源提供了一個(gè)非常靈活和強(qiáng)大的機(jī)制,使得在同一個(gè)應(yīng)用中根據(jù)業(yè)務(wù)需要選擇不同的數(shù)據(jù)源變得簡(jiǎn)單和直接。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載

    Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載

    這篇文章主要介紹了Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析

    Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析

    這篇文章主要介紹了Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式,結(jié)合實(shí)例形式分析了動(dòng)態(tài)代理模式的概念、功能、組成、定義與使用方法,需要的朋友可以參考下
    2018-04-04
  • Java中List add添加不同類(lèi)型元素的講解

    Java中List add添加不同類(lèi)型元素的講解

    今天小編就為大家分享一篇關(guān)于java的List add不同類(lèi)型的對(duì)象,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java聊天室之實(shí)現(xiàn)接收和發(fā)送Socket

    Java聊天室之實(shí)現(xiàn)接收和發(fā)送Socket

    這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)接收和發(fā)送Socket功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • java方法重寫(xiě)(重點(diǎn)講),方法重載問(wèn)題

    java方法重寫(xiě)(重點(diǎn)講),方法重載問(wèn)題

    這篇文章主要介紹了java方法重寫(xiě)(重點(diǎn)講),方法重載問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java 數(shù)值類(lèi)型分秒時(shí)間格式化的實(shí)例代碼

    java 數(shù)值類(lèi)型分秒時(shí)間格式化的實(shí)例代碼

    這篇文章主要介紹了java 數(shù)值類(lèi)型分秒時(shí)間格式化的實(shí)例代碼的相關(guān)資料,將秒或分鐘的值轉(zhuǎn)換為xx天xx小時(shí)xx分鐘xx秒 如果 “xx” 為0 自動(dòng)缺省,需要的朋友可以參考下
    2017-07-07
  • SpringBoot中集成日志的四種方式

    SpringBoot中集成日志的四種方式

    在開(kāi)發(fā)中,日志記錄是保障應(yīng)用程序健壯性、可維護(hù)性的重要手段,通過(guò)日志,我們可以記錄系統(tǒng)的運(yùn)行狀態(tài)、捕獲異常并進(jìn)行調(diào)試,Spring Boot 默認(rèn)使用的是 Logback,但你也可以根據(jù)需求選擇其他框架,以下是幾種常用的日志集成方法,需要的朋友可以參考下
    2024-10-10
  • SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    本文詳細(xì)介紹了SpringCloud中AccessLog的相關(guān)配置,我們可以根據(jù)文中的相關(guān)數(shù)據(jù)配置出所需的AccessLog的信息以及格式,感興趣的小伙伴可以參考一下
    2021-08-08
  • 淺談Java代理(jdk靜態(tài)代理、動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理)

    淺談Java代理(jdk靜態(tài)代理、動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理)

    下面小編就為大家?guī)?lái)一篇淺談Java代理(jdk靜態(tài)代理、動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java單例模式實(shí)現(xiàn)的幾種方式

    Java單例模式實(shí)現(xiàn)的幾種方式

    這篇文章主要介紹了Java單例模式實(shí)現(xiàn)的幾種方式的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

滦南县| 纳雍县| 峨山| 海伦市| 白沙| 武穴市| 斗六市| 江西省| 绍兴市| 阿图什市| 吉木萨尔县| 东乌珠穆沁旗| 柳林县| 东阳市| 正蓝旗| 泊头市| 富裕县| 上蔡县| 通山县| 东乡县| 永德县| 洛川县| 宝应县| 墨玉县| 鄱阳县| 新龙县| 论坛| 依兰县| 咸宁市| 卓尼县| 文成县| 云和县| 于都县| 白河县| 盘山县| 永修县| 华坪县| 岳普湖县| 涿州市| 兴和县| 凤翔县|