中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中怎么使用Dynamic Datasource配置多數據源

發布時間:2021-06-22 16:42:42 來源:億速云 閱讀:1461 作者:Leah 欄目:編程語言

SpringBoot中怎么使用Dynamic Datasource配置多數據源,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

功能特性:

  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配置多數據源

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙城县| 通河县| 枣阳市| 凤城市| 本溪市| 宜宾市| 响水县| 高邑县| 沈丘县| 大同县| 广州市| 延川县| 绥化市| 巴南区| 称多县| 寿宁县| 安福县| 鹤山市| 宜昌市| 开远市| 明光市| 嵊州市| 兰考县| 郎溪县| 罗山县| 吉林省| 晋中市| 屏东县| 旬阳县| 万安县| 榕江县| 张家界市| 杭州市| 通州区| 临武县| 辉县市| 昌黎县| 易门县| 巴林左旗| 大英县| 临猗县|