首頁 > Java > java教程 > 主體

SpringBoot中如何使用Dynamic Datasource配置多重資料來源

PHPz
發布: 2023-05-16 19:07:23
轉載
2650 人瀏覽過

功能特性:

  1. 支援 資料來源分組 ,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。

  2. 支援無資料來源啟動,支援設定懶啟動資料來源(3.3.2 )。

  3. 支援資料庫敏感設定資訊 加密 ENC()。

  4. 支援每個資料庫獨立初始化表結構schema和資料庫database。

  5. 支援 自訂註解 ,需繼承DS(3.2.0 )。

  6. 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速整合。

  7. 簡化Druid和HikariCp的配置,並提供全域參數配置。配置一次,全域通用。

  8. 提供 自訂資料來源 方案。

  9. 提供專案啟動後 動態增加移除資料來源 方案。

  10. 提供Mybatis環境下的 純讀寫分離 方案。

  11. 提供解析資料來源方案的方法,使用SpEL動態參數。內建spel,session,header,支援自訂。

  12. 支援 多層資料來源巢狀切換 。 (ServiceA >>> ServiceB >>> ServiceC)。

  13. 提供對shiro,sharding-jdbc,quartz等第三方函式庫整合的方案,注意事項與範例。

  14. 提供 基於seata的分散式交易方案。 附:不支援原生spring事務。

  15. 提供 本地多重資料來源交易方案。 附:不支援原生spring事務(3.3.1 )。

我們這篇文章主要實作讀寫分離,一主多從的環境。

  • 主資料庫建議只執行 INSERT、UPDATE、DELETE 作業。

  • 從資料庫建議只執行 SELECT 操作。

一、準備資料庫

主函式庫:PiaoDB

SpringBoot中如何使用Dynamic Datasource配置多数据源

##從庫1:PiaoDB2

SpringBoot中如何使用Dynamic Datasource配置多数据源

從庫2:PiaoDB3

SpringBoot中如何使用Dynamic Datasource配置多数据源

二、匯入POM檔案

引入dynamic-datasource-spring-boot-starter。

<!-- 多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>
登入後複製

三、編輯設定檔

我們設定了一個主庫、兩個從庫。

  • 設定檔中所有下列劃線 _ 分割的資料來源「首部」即為群組的名稱,相同群組名稱的資料來源會放在一個群組下。

  • 預設的資料來源名稱為 master ,我們可以透過 spring.datasource.dynamic.primary 修改。

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/PiaoDB?serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://localhost:3306/PiaoDB2?serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: jdbc:mysql://localhost:3306/PiaoDB3?serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
登入後複製
因為我們使用的是阿里資料庫連線池 Druid,需要排除原生 Druid 的快速設定類別。

其他第三方整合位址:整合Druid

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
登入後複製
某些springBoot的版本上面可能無法排除可用下列方式排除。

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
登入後複製
除了設定一主多從,我們還可以設定。

# 多主多从                      纯粹多库(记得设置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:                              h3:                                   oracle_2:
登入後複製

四、寫程式碼

使用 @DS 切換資料來源。 @DS 可以註解在方法上和類別上。如果同時存在,方法註解優先於類別上註解。強烈建議註解在 service 實作或 mapper 介面方法上。

  • @DS("xxx") 指定使用 xxx 這個資料來源,xxx 可以為群組名稱也可以為具體某個函式庫的名稱。如果是組名則切換時採用負載平衡演算法切換。如果指定的組名或庫不存在,則自動使用預設資料來源(主庫)

  • #如果沒有@DS,則使用預設資料來源(主庫)

  • ##如果設定了@DS 但沒有指定某個群組或庫,則根據DynamicDataSourceStrategy 策略,選擇一個從庫。預設負載平衡策略。

1、寫Controller 

@RestController
@RequiredArgsConstructor
@RequestMapping("/demo")
public class DemoController {

    private final DemoService demoService;

    @GetMapping("/add")
    public String add() {
        return demoService.add(null) + "";
    }

    @GetMapping("/selectGoodsInfo")
    public List<GoodsInfo> selectGoodsInfo(){
        return demoService.selectGoodsInfo();
    }

    @GetMapping("/selectMasterGoodsInfo")
    public List<GoodsInfo> selectMasterGoodsInfo(){
        return demoService.selectMasterGoodsInfo();
    }

}
登入後複製
2、寫Service

public interface DemoService {

    boolean add(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

    List<GoodsInfo> selectMasterGoodsInfo();

}
登入後複製
@Service
@RequiredArgsConstructor
public class DemoServiceImpl implements DemoService {

    private final DemoMapper demoMapper;

    @DS("master")
    @Override
    public boolean add(GoodsInfo param) {
        param = new GoodsInfo();
        param.setGname("1200元秒杀华为Pad");
        param.setGnum(100);

        return demoMapper.insertGoodsInfo(param);
    }

    @DS("slave")
    @Override
    public List<GoodsInfo> selectGoodsInfo() {
        return demoMapper.selectGoodsInfo();
    }

    @DS("master")
    @Override
    public List<GoodsInfo> selectMasterGoodsInfo() {
        return demoMapper.selectGoodsInfo();
    }

}
登入後複製
3、寫Mapper

@Mapper
public interface DemoMapper {

    boolean insertGoodsInfo(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

}
登入後複製
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.DemoMapper">

    <select id="selectGoodsInfo" resultType="com.example.demo.entity.GoodsInfo">
        select * from t_goods_info
    </select>

    <insert id="insertGoodsInfo">
        insert into t_goods_info (gname, gnum, gcreatetime)
            values (#{gname}, #{gnum}, now());
    </insert>

</mapper>
登入後複製

五、驗證結果

1、請求新增介面(向主庫新增資料):127.0.0.1:8086/demo/add

2、請求查詢主庫數據介面:127.0.0.1:8086/demo/selectMasterGoodsInfo

SpringBoot中如何使用Dynamic Datasource配置多数据源

#3、請求從庫資料介面(負載平衡):

#第一次要求:

SpringBoot中如何使用Dynamic Datasource配置多数据源

第二次請求:

SpringBoot中如何使用Dynamic Datasource配置多数据源#

以上是SpringBoot中如何使用Dynamic Datasource配置多重資料來源的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!