亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的項(xiàng)目實(shí)踐

 更新時(shí)間:2024年04月12日 10:39:22   作者:擁抱AI  
在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常遇到需要同時(shí)操作多個(gè)數(shù)據(jù)源的情況,本文主要介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下

本文將介紹如何在 Spring Boot 應(yīng)用中實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換,包括具體實(shí)現(xiàn)步驟和示例代碼。通過(guò)本文的學(xué)習(xí),你將能夠輕松應(yīng)對(duì)多種數(shù)據(jù)源切換的場(chǎng)景,提高應(yīng)用程序的靈活性和可擴(kuò)展性。

一. 引言

在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常遇到需要同時(shí)操作多個(gè)數(shù)據(jù)源的情況。例如,可能需要從不同的數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),或者根據(jù)業(yè)務(wù)需求將數(shù)據(jù)寫(xiě)入不同的數(shù)據(jù)庫(kù)。在這種情況下,動(dòng)態(tài)數(shù)據(jù)源切換就變得尤為重要。Spring Boot 提供了強(qiáng)大的數(shù)據(jù)源配置功能,使得動(dòng)態(tài)數(shù)據(jù)源切換變得相對(duì)簡(jiǎn)單。本文將詳細(xì)介紹如何在 Spring Boot 應(yīng)用中實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換。

二. 準(zhǔn)備工作

在開(kāi)始實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換之前,我們需要做一些準(zhǔn)備工作:

1.創(chuàng)建 Spring Boot 項(xiàng)目

首先,我們需要?jiǎng)?chuàng)建一個(gè) Spring Boot 項(xiàng)目??梢允褂?Spring Initializr(https://start.spring.io/)快速生成項(xiàng)目骨架。在創(chuàng)建項(xiàng)目時(shí),選擇合適的 JDK 版本、項(xiàng)目構(gòu)建工具(如 Maven 或 Gradle)以及項(xiàng)目元數(shù)據(jù)(如項(xiàng)目名稱、描述、包名等)。

2.添加依賴

在項(xiàng)目的 pom.xml 文件中添加以下依賴:

<dependencies>
    <!-- Spring Boot Web 依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot 數(shù)據(jù)源依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)依賴,以 MySQL 為例 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

三. 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換

接下來(lái),我們將介紹如何實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換。主要分為以下幾個(gè)步驟:

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

在 application.properties 或 application.yml 文件中配置多個(gè)數(shù)據(jù)源,如下所示:

spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    secondary:
      url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

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

創(chuàng)建一個(gè)數(shù)據(jù)源配置類,用于生成 DataSource 對(duì)象。這里我們使用 Java 配置的方式,如下所示:

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

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

創(chuàng)建一個(gè)動(dòng)態(tài)數(shù)據(jù)源路由類,用于根據(jù)不同的條件切換不同的數(shù)據(jù)源。如下所示:

public class DynamicDataSourceContextHolder {
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
    public static void setDataSourceType(String dataSourceType) {
        CONTEXT_HOLDER.set(dataSourceType);
    }
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}

4.配置數(shù)據(jù)源路由

在 application.properties 或 application.yml 文件中配置數(shù)據(jù)源路由,如下所示:

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    dynamic:
      primary: primaryDataSource
      secondary: secondaryDataSource

5.創(chuàng)建數(shù)據(jù)源切換切面

創(chuàng)建一個(gè)切面類,用于在方法執(zhí)行前切換數(shù)據(jù)源,在方法執(zhí)行后恢復(fù)數(shù)據(jù)源。如下所示:

@Aspect
@Component
public class DynamicDataSourceAspect {
    @Before("@annotation(TargetDataSource)")
    public void switchDataSource(JoinPoint point) {
        // 獲取方法上的注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        TargetDataSource ds = method.getAnnotation(TargetDataSource.class);
        // 判斷注解是否為空
        if (ds == null) {
            return;
        }
        // 切換數(shù)據(jù)源
        DynamicDataSourceContextHolder.setDataSourceType(ds.name());
    }
    @After("@annotation(TargetDataSource)")
    public void restoreDataSource(JoinPoint point) {
        // 獲取方法上的注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        TargetDataSource ds = method.getAnnotation(TargetDataSource.class);
        // 判斷注解是否為空
        if (ds == null) {
            return;
        }
        // 恢復(fù)數(shù)據(jù)源
        DynamicDataSourceContextHolder.clearDataSourceType();
    }
}

6.創(chuàng)建自定義注解

創(chuàng)建一個(gè)自定義注解,用于標(biāo)記需要切換數(shù)據(jù)源的方法。如下所示:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TargetDataSource {
    String name();
}

7.使用自定義注解

在需要切換數(shù)據(jù)源的方法上使用自定義注解,如下所示:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    @TargetDataSource(name = "primary")
    public List<User> findUsersFromPrimary() {
        return userMapper.findAll();
    }
    @TargetDataSource(name = "secondary")
    public List<User> findUsersFromSecondary() {
        return userMapper.findAll();
    }
}

四. 測(cè)試動(dòng)態(tài)數(shù)據(jù)源切換

為了驗(yàn)證我們的動(dòng)態(tài)數(shù)據(jù)源切換是否生效,我們可以編寫(xiě)一些測(cè)試用例來(lái)模擬不同的數(shù)據(jù)源切換場(chǎng)景。
首先,我們需要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的實(shí)體類和對(duì)應(yīng)的倉(cāng)庫(kù)接口:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // 省略 getter 和 setter
}
public interface UserRepository extends JpaRepository<User, Long> {
}

然后,我們可以編寫(xiě)一個(gè)測(cè)試類來(lái)測(cè)試動(dòng)態(tài)數(shù)據(jù)源的切換:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;
    @Test
    public void testDynamicDataSource() {
        List<User> usersFromPrimary = userService.findUsersFromPrimary();
        List<User> usersFromSecondary = userService.findUsersFromSecondary();
        
        // 假設(shè)我們期望從主數(shù)據(jù)源和從數(shù)據(jù)源分別查詢到不同的用戶列表
        assertNotNull(usersFromPrimary);
        assertNotNull(usersFromSecondary);
        assertNotEquals(usersFromPrimary, usersFromSecondary);
    }
}

在這個(gè)測(cè)試類中,我們注入了 UserService,并調(diào)用了兩個(gè)方法來(lái)分別從主數(shù)據(jù)源和從數(shù)據(jù)源查詢用戶列表。我們使用了 assertNotNull 和 assertNotEquals 來(lái)驗(yàn)證查詢結(jié)果,確保我們從兩個(gè)不同的數(shù)據(jù)源獲取到了不同的數(shù)據(jù)。

五. 注意事項(xiàng)

在實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換時(shí),有幾個(gè)注意事項(xiàng)需要牢記:

  • 確保所有的數(shù)據(jù)源配置都是正確的,包括URL、用戶名、密碼和驅(qū)動(dòng)類名。
  • 在切換數(shù)據(jù)源時(shí),要確保在操作完成后恢復(fù)到默認(rèn)數(shù)據(jù)源,以避免影響其他業(yè)務(wù)邏輯。
  • 在生產(chǎn)環(huán)境中,要考慮數(shù)據(jù)源切換的性能影響,尤其是在高并發(fā)場(chǎng)景下。
  • 動(dòng)態(tài)數(shù)據(jù)源切換可能會(huì)增加代碼的復(fù)雜性,因此要謹(jǐn)慎使用,確保它帶來(lái)的好處大于維護(hù)成本。

六. 總結(jié)

本文詳細(xì)介紹了在 Spring Boot 應(yīng)用中實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法。通過(guò)配置多個(gè)數(shù)據(jù)源、創(chuàng)建數(shù)據(jù)源路由、使用切面編程和自定義注解,我們可以在運(yùn)行時(shí)根據(jù)業(yè)務(wù)需求靈活地切換數(shù)據(jù)源。這種方法特別適合于需要同時(shí)訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)或數(shù)據(jù)源的應(yīng)用場(chǎng)景。雖然動(dòng)態(tài)數(shù)據(jù)源切換增加了系統(tǒng)的復(fù)雜性,但正確使用它可以為應(yīng)用帶來(lái)更高的靈活性和可擴(kuò)展性。

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot 動(dòng)態(tài)數(shù)據(jù)源切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring MVC中使用Controller如何進(jìn)行重定向

    Spring MVC中使用Controller如何進(jìn)行重定向

    這篇文章主要介紹了Spring MVC中使用Controller如何進(jìn)行重定向操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java8?Stream?collect(Collectors.toMap())的使用

    Java8?Stream?collect(Collectors.toMap())的使用

    這篇文章主要介紹了Java8?Stream?collect(Collectors.toMap())的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)功能界面

    Java實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)功能界面

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)功能界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換

    詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換

    這篇文章主要介紹了詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • 淺談java 中文件的讀取File、以及相對(duì)路徑的問(wèn)題

    淺談java 中文件的讀取File、以及相對(duì)路徑的問(wèn)題

    今天小編就為大家分享一篇淺談java 中文件的讀取File、以及相對(duì)路徑的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • java ZipFile如何將多級(jí)目錄壓縮

    java ZipFile如何將多級(jí)目錄壓縮

    這篇文章主要介紹了java ZipFile如何將多級(jí)目錄壓縮問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JAVA中三種常用的循環(huán)語(yǔ)句詳解

    JAVA中三種常用的循環(huán)語(yǔ)句詳解

    這篇文章主要介紹了JAVA中三種常用的循環(huán)語(yǔ)句詳解,包括格式和執(zhí)行流程,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 使用Java計(jì)算屏幕的PPI的方法詳解

    使用Java計(jì)算屏幕的PPI的方法詳解

    在現(xiàn)代電子設(shè)備中,屏幕的分辨率和顯示效果是用戶非常關(guān)注的一個(gè)指標(biāo),PPI(Pixels Per Inch,每英寸像素?cái)?shù))是衡量屏幕顯示精度的重要參數(shù)之一,PPI越高,屏幕顯示的圖像越細(xì)膩,視覺(jué)效果越好,本文將詳細(xì)介紹PPI的概念、計(jì)算方法,并通過(guò)Java代碼實(shí)現(xiàn)PPI的計(jì)算
    2025-02-02
  • Java模擬計(jì)算機(jī)的整數(shù)乘積計(jì)算功能示例

    Java模擬計(jì)算機(jī)的整數(shù)乘積計(jì)算功能示例

    這篇文章主要介紹了Java模擬計(jì)算機(jī)的整數(shù)乘積計(jì)算功能,簡(jiǎn)單分析了計(jì)算機(jī)數(shù)值進(jìn)制轉(zhuǎn)換與通過(guò)位移進(jìn)行乘積計(jì)算的原理,并結(jié)合具體實(shí)例給出了java模擬計(jì)算機(jī)成績(jī)運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • jdk21安裝后無(wú)jre文件該如何解決

    jdk21安裝后無(wú)jre文件該如何解決

    java開(kāi)發(fā)少不了安裝jdk,下面這篇文章主要給大家介紹了關(guān)于jdk21安裝后無(wú)jre文件該如何解決的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05

最新評(píng)論