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

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

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

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

一. 引言

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

二. 準備工作

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

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

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

2.添加依賴

在項目的 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ù)庫驅(qū)動依賴,以 MySQL 為例 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

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

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

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

在 application.properties 或 application.yml 文件中配置多個數(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)建一個數(shù)據(jù)源配置類,用于生成 DataSource 對象。這里我們使用 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)建動態(tài)數(shù)據(jù)源路由

創(chuà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)建一個切面類,用于在方法執(zhí)行前切換數(shù)據(jù)源,在方法執(zhí)行后恢復數(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;
        }
        // 恢復數(shù)據(jù)源
        DynamicDataSourceContextHolder.clearDataSourceType();
    }
}

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

創(chuàng)建一個自定義注解,用于標記需要切換數(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();
    }
}

四. 測試動態(tài)數(shù)據(jù)源切換

為了驗證我們的動態(tài)數(shù)據(jù)源切換是否生效,我們可以編寫一些測試用例來模擬不同的數(shù)據(jù)源切換場景。
首先,我們需要創(chuàng)建一個簡單的實體類和對應的倉庫接口:

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

然后,我們可以編寫一個測試類來測試動態(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);
    }
}

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

五. 注意事項

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

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

六. 總結(jié)

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

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

相關(guān)文章

  • 帶你深入了解java-代理機制

    帶你深入了解java-代理機制

    Java 有兩種代理方式,一種是靜態(tài)代理,另一種是動態(tài)代理。如果我們在代碼編譯時就確定了被代理的類是哪一個,那么就可以直接使用靜態(tài)代理;如果不能確定,那么可以使用類的動態(tài)加載機制,在代碼運行期間加載被代理的類這就是動態(tài)代理
    2021-08-08
  • 基于mybatis batch實現(xiàn)批量提交大量數(shù)據(jù)

    基于mybatis batch實現(xiàn)批量提交大量數(shù)據(jù)

    這篇文章主要介紹了基于mybatis batch實現(xiàn)批量提交大量數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java?中的5個代碼性能提升技巧

    Java?中的5個代碼性能提升技巧

    這篇文章主要給大家分享了Java的5個代碼性能提升的技巧,雖然大多數(shù)情況下極致優(yōu)化代碼是沒有必要的,但是作為一名技術(shù)開發(fā)者,我們還是想追求代碼的更小、更快,更強。如果哪天發(fā)現(xiàn)程序的運行速度不盡人意,就需要這樣的文章了,需要的朋友可以參考一下
    2021-12-12
  • 基于@RequestParam name和value屬性的區(qū)別

    基于@RequestParam name和value屬性的區(qū)別

    這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 通過String.intern()方法淺談堆中常量池

    通過String.intern()方法淺談堆中常量池

    這篇文章主要介紹了通過String.intern()方法淺談堆中常量池,在JDK7之前,字符串常量是存在永久帶Perm 區(qū)的,JDK7開始在將常量池遷移到堆中,這個變化也導致了String的新特性,下面我們慢慢進行介紹。,需要的朋友可以參考下
    2019-06-06
  • java 中內(nèi)部類的實例詳解

    java 中內(nèi)部類的實例詳解

    這篇文章主要介紹了java 中內(nèi)部類的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java基本數(shù)據(jù)類型和運算符詳解

    Java基本數(shù)據(jù)類型和運算符詳解

    這篇文章主要介紹了Java基本數(shù)據(jù)類型和運算符,結(jié)合實例形式詳細分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運算符、邏輯運算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2020-02-02
  • Springboot 整合 Java DL4J 實現(xiàn)農(nóng)產(chǎn)品質(zhì)量檢測系統(tǒng)(推薦)

    Springboot 整合 Java DL4J 實現(xiàn)農(nóng)產(chǎn)品質(zhì)量檢測系統(tǒng)(推薦)

    本文詳細介紹了系統(tǒng)的搭建過程,包括技術(shù)選型、數(shù)據(jù)處理、模型訓練和評估等關(guān)鍵步驟,系統(tǒng)采用卷積神經(jīng)網(wǎng)絡(luò),對水果成熟度和缺陷進行識別,有效解決了傳統(tǒng)方法成本高、效率低的問題,有助于提升農(nóng)產(chǎn)品檢測的科技含量和自動化水平
    2024-10-10
  • SpringBoot自動裝配之Condition深入講解

    SpringBoot自動裝配之Condition深入講解

    @Conditional表示僅當所有指定條件都匹配時,組件才有資格注冊。該@Conditional注釋可以在以下任一方式使用:作為任何@Bean方法的方法級注釋、作為任何類的直接或間接注釋的類型級別注釋@Component,包括@Configuration類、作為元注釋,目的是組成自定義構(gòu)造型注釋
    2023-01-01
  • MyBatis高級映射及延遲加載的實現(xiàn)

    MyBatis高級映射及延遲加載的實現(xiàn)

    MyBatis在處理對象關(guān)系映射時,多對一關(guān)系是常見的場景,本文就來介紹了MyBatis高級映射及延遲加載的實現(xiàn),感興趣的可以了解一下
    2024-11-11

最新評論

汝阳县| 揭东县| 沈阳市| 高尔夫| 乐平市| 阳高县| 远安县| 南丰县| 广安市| 独山县| 芜湖市| 呼和浩特市| 宣武区| 周宁县| 苗栗市| 普宁市| 兴化市| 泾阳县| 集贤县| 高要市| 专栏| 韶山市| 凌海市| 大埔区| 德州市| 平遥县| 宁化县| 隆昌县| 洛浦县| 新绛县| 南阳市| 马龙县| 咸阳市| 浙江省| 兰考县| 岗巴县| 邢台市| 正镶白旗| 织金县| 广汉市| 屏山县|