功能特性:
支援 資料來源分組 ,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
支援無資料來源啟動,支援設定懶啟動資料來源(3.3.2 )。
支援資料庫敏感設定資訊 加密 ENC()。
支援每個資料庫獨立初始化表結構schema和資料庫database。
支援 自訂註解 ,需繼承DS(3.2.0 )。
提供對Druid,Mybatis-Plus,P6sy,Jndi的快速整合。
簡化Druid和HikariCp的配置,並提供全域參數配置。配置一次,全域通用。
提供 自訂資料來源 方案。
提供專案啟動後 動態增加移除資料來源 方案。
提供Mybatis環境下的 純讀寫分離 方案。
提供解析資料來源方案的方法,使用SpEL動態參數。內建spel,session,header,支援自訂。
支援 多層資料來源巢狀切換 。 (ServiceA >>> ServiceB >>> ServiceC)。
提供對shiro,sharding-jdbc,quartz等第三方函式庫整合的方案,注意事項與範例。
提供 基於seata的分散式交易方案。 附:不支援原生spring事務。
提供 本地多重資料來源交易方案。 附:不支援原生spring事務(3.3.1 )。
我們這篇文章主要實作讀寫分離,一主多從的環境。
主資料庫建議只執行 INSERT、UPDATE、DELETE 作業。
從資料庫建議只執行 SELECT 操作。
一、準備資料庫
主函式庫:PiaoDB
##從庫1:PiaoDB2 從庫2:PiaoDB3二、匯入POM檔案
引入dynamic-datasource-spring-boot-starter。<!-- 多数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.2</version> </dependency>
三、編輯設定檔
我們設定了一個主庫、兩個從庫。因為我們使用的是阿里資料庫連線池 Druid,需要排除原生 Druid 的快速設定類別。 其他第三方整合位址:整合Druid
- 設定檔中所有下列劃線 _ 分割的資料來源「首部」即為群組的名稱,相同群組名稱的資料來源會放在一個群組下。
- 預設的資料來源名稱為 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登入後複製
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
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 介面方法上。1、寫Controller
- @DS("xxx") 指定使用 xxx 這個資料來源,xxx 可以為群組名稱也可以為具體某個函式庫的名稱。如果是組名則切換時採用負載平衡演算法切換。如果指定的組名或庫不存在,則自動使用預設資料來源(主庫)
- #如果沒有@DS,則使用預設資料來源(主庫)
- ##如果設定了@DS 但沒有指定某個群組或庫,則根據DynamicDataSourceStrategy 策略,選擇一個從庫。預設負載平衡策略。
@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(); } }
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(); } }
@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/add2、請求查詢主庫數據介面:127.0.0.1:8086/demo/selectMasterGoodsInfo #3、請求從庫資料介面(負載平衡):#第一次要求: 第二次請求:#
以上是SpringBoot中如何使用Dynamic Datasource配置多重資料來源的詳細內容。更多資訊請關注PHP中文網其他相關文章!