偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringBoot整合Mybatis-Plus多數(shù)據(jù)源

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
MyBatis-Plus則是一個(gè)優(yōu)秀的ORM框架,它為我們封裝了大量的數(shù)據(jù)庫(kù)操作細(xì)節(jié),簡(jiǎn)化了我們的開(kāi)發(fā)工作,同時(shí)也提供了多數(shù)據(jù)源方案。

一、前言

隨著業(yè)務(wù)的不斷擴(kuò)展和復(fù)雜度的增加,我們?cè)陂_(kāi)發(fā)過(guò)程中往往需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)。比如:我們可能需要同時(shí)訪問(wèn)主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù),或者訪問(wèn)多個(gè)獨(dú)立的數(shù)據(jù)庫(kù)來(lái)處理不同的業(yè)務(wù)邏輯。這時(shí)候,我們就需要使用多數(shù)據(jù)源來(lái)實(shí)現(xiàn)對(duì)多個(gè)數(shù)據(jù)庫(kù)的操作。

MyBatis-Plus則是一個(gè)優(yōu)秀的ORM框架,它為我們封裝了大量的數(shù)據(jù)庫(kù)操作細(xì)節(jié),簡(jiǎn)化了我們的開(kāi)發(fā)工作,同時(shí)也提供了多數(shù)據(jù)源方案。

  • dynamic-datasource 開(kāi)源文檔付費(fèi),屬于組織參與者小鍋蓋發(fā)起的項(xiàng)目。
  • mybatis-mate 企業(yè)級(jí)付費(fèi)授權(quán),資料文檔免費(fèi)。

今天我們以第一種方案來(lái)具體說(shuō)一下怎么實(shí)現(xiàn)!

MyBatis-Plus多數(shù)據(jù)源官網(wǎng):https://baomidou.com/pages/a61e1b/#dynamic-datasource。

二、簡(jiǎn)單搭建測(cè)試

1、準(zhǔn)備工作

我們先把一些使用的版本列舉一下,方便大家看!

  • Spring Boot:2.7.4
  • dynamic-datasource:3.5.1
  • mybatis-plus:3.5.1

數(shù)據(jù)庫(kù)方面這里就不演示了,我們準(zhǔn)備好兩個(gè)mysql數(shù)據(jù)庫(kù):

圖片

2、添加依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

3、yml配置

spring:
  datasource:
    #使用阿里的Druid
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    dynamic:
      primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master
      strict: false #嚴(yán)格匹配數(shù)據(jù)源,默認(rèn)false. true未匹配到指定數(shù)據(jù)源時(shí)拋異常,false使用默認(rèn)數(shù)據(jù)源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/test?serverTimeznotallow=Asia/Shanghai
          username: root
          password:
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/test1?serverTimeznotallow=Asia/Shanghai
          username: root
          password:

「補(bǔ)充:」

可以繼續(xù)多種模式,咱們以簡(jiǎn)單的進(jìn)行演示!

# 多主多從                      純粹多庫(kù)(記得設(shè)置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                                   oracle_2:

4、實(shí)體類

@Data
public class Test {

    @TableId
    private Integer id;
    private String name;
    private Integer age;
    private LocalDateTime time;
    private LocalDateTime createdAt;
}

5、多數(shù)據(jù)源配置Mapper

使用 @DS 切換數(shù)據(jù)源。@DS 可以注解在方法上或類上,同時(shí)存在就近原則 方法上注解 優(yōu)先于 類上注解。

注解

結(jié)果

沒(méi)有@DS

默認(rèn)數(shù)據(jù)源

@DS("dsName")

dsName可以為組名也可以為具體某個(gè)庫(kù)的名稱

public interface TestDbMapper extends BaseMapper<Test> {
}
@DS("slave_1")
public interface TestDb2Mapper extends BaseMapper<Test> {
}

注意:

這里@DS可以添加在service中的方法上來(lái)切換數(shù)據(jù)源,也可以像小編一樣加在Mapper接口上!

他們各有優(yōu)缺點(diǎn),我們需要權(quán)衡利弊進(jìn)行選擇:

如果一個(gè)Service只需要使用一個(gè)數(shù)據(jù)源,或者多個(gè)Service方法都需要使用相同的數(shù)據(jù)源,則建議將@DS注解添加到Mapper接口或XML文件上;如果需要根據(jù)不同的業(yè)務(wù)場(chǎng)景動(dòng)態(tài)切換數(shù)據(jù)源,則可以選擇在Service方法上使用@DS注解。

當(dāng)然還有一種情況,一個(gè)service方法操作不同的數(shù)據(jù)源,表結(jié)構(gòu)一樣的話可以使用一個(gè)mapper。

在service內(nèi)部進(jìn)行切換,我們看到官方注釋,「非必要不要這么使用」!

// 設(shè)置當(dāng)前線程數(shù)據(jù)源 如非必要不要手動(dòng)調(diào)用,調(diào)用后確保最終清除
DynamicDataSourceContextHolder.push("slave_1");
// 獲得當(dāng)前線程數(shù)據(jù)源
DynamicDataSourceContextHolder.peek();
// 強(qiáng)制清空本地線程 防止內(nèi)存泄漏,如手動(dòng)調(diào)用了push可調(diào)用此方法確保清除
DynamicDataSourceContextHolder.poll();

完整代碼塊:

@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1993);
    test.setName("add方法");
    // 切換指定數(shù)據(jù)源
    DynamicDataSourceContextHolder.push("slave_1");
    testDbMapper.insert(test);
    //查看當(dāng)前數(shù)據(jù)源
    log.info(DynamicDataSourceContextHolder.peek());
    //移除數(shù)據(jù)源,恢復(fù)master數(shù)據(jù)源
    DynamicDataSourceContextHolder.clear();
    testDbMapper.insert(test);
    return Result.success("222");
}

圖片

數(shù)據(jù)庫(kù)展示:

圖片

6、測(cè)試

我們還是以把@DS放在mapper類上來(lái)進(jìn)行演示:

@Autowired
private TestDbMapper testDbMapper;
@Autowired
private TestDb2Mapper testDb2Mapper;
@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1994);
    test.setName("add方法");
    testDbMapper.insert(test);
    testDb2Mapper.insert(test);
    return Result.success("222");
}

圖片

數(shù)據(jù)庫(kù)正常保存到兩個(gè)庫(kù),測(cè)試通過(guò)!

圖片


7、事務(wù)問(wèn)題

在使用多數(shù)據(jù)源的同時(shí),也帶來(lái)了一下事務(wù)問(wèn)題,如果一個(gè)方法添加了@Transactional(rollbackFor = Exception.class)事務(wù),默認(rèn)查詢只會(huì)從默認(rèn)庫(kù)來(lái)查詢。

這個(gè)問(wèn)題是要解決的,這里小編給幾個(gè)思路大家可以試一下!

  • Spring Boot提供了一個(gè)基于Atomikos的JTA實(shí)現(xiàn)。
  • 可以配置多個(gè)DataSourceTransactionManager進(jìn)行管理事務(wù)。

能分開(kāi)系統(tǒng)來(lái)進(jìn)行數(shù)據(jù)源的隔離,需要查詢數(shù)據(jù)可以使用feign來(lái)獲取!小編還沒(méi)在企業(yè)中使用多數(shù)據(jù)源,缺乏一下關(guān)于事務(wù)方面的分享,大家有想法或者熟悉的可以留言分享一下自己的經(jīng)驗(yàn)!

三、總結(jié)

希望這篇博客能夠幫助讀者更好地理解和掌握Spring Boot和MyBatis-Plus多數(shù)據(jù)源的使用方法,并應(yīng)用到實(shí)際項(xiàng)目中去。同時(shí),也提醒讀者在使用多數(shù)據(jù)源的時(shí)候要注意事項(xiàng),比如事務(wù)管理、連接池配置等,以確保系統(tǒng)的穩(wěn)定性和可靠性。

責(zé)任編輯:姜華 來(lái)源: 小王博客基地
相關(guān)推薦

2023-01-04 09:33:31

SpringBootMybatis

2024-10-30 10:22:17

2023-09-07 08:39:39

copy屬性數(shù)據(jù)源

2020-12-31 07:55:33

spring bootMybatis數(shù)據(jù)庫(kù)

2022-05-18 12:04:19

Mybatis數(shù)據(jù)源Spring

2023-12-13 12:20:36

SpringMySQL數(shù)據(jù)源

2025-04-14 01:00:00

Calcite電商系統(tǒng)MySQL

2020-06-02 07:55:31

SpringBoot多數(shù)據(jù)源

2024-12-20 16:49:15

MyBatis開(kāi)發(fā)代碼

2020-03-13 14:05:14

SpringBoot+數(shù)據(jù)源Java

2020-11-24 09:56:12

數(shù)據(jù)源讀寫分離

2024-04-30 09:17:06

SpringBootMybatis動(dòng)態(tài)數(shù)據(jù)源

2009-08-14 10:26:27

ibatis多數(shù)據(jù)源

2023-10-31 07:52:53

多數(shù)據(jù)源管理后端

2025-01-09 11:21:25

2022-12-19 07:21:35

Hutool-db數(shù)據(jù)庫(kù)JDBC

2022-05-10 10:43:35

數(shù)據(jù)源動(dòng)態(tài)切換Spring

2025-02-27 09:45:47

2022-12-29 08:49:40

SpringBootExcel

2025-05-26 03:20:00

SpringMyBatis數(shù)據(jù)權(quán)限
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)