您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“SpringBoot中如何使用Dynamic Datasource配置多數(shù)據(jù)源”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
功能特性:
支持 數(shù)據(jù)源分組 ,適用于多種場(chǎng)景 純粹多庫(kù) 讀寫分離 一主多從 混合模式。
支持無(wú)數(shù)據(jù)源啟動(dòng),支持配置懶啟動(dòng)數(shù)據(jù)源(3.3.2+)。
支持?jǐn)?shù)據(jù)庫(kù)敏感配置信息 加密 ENC()。
支持每個(gè)數(shù)據(jù)庫(kù)獨(dú)立初始化表結(jié)構(gòu)schema和數(shù)據(jù)庫(kù)database。
支持 自定義注解 ,需繼承DS(3.2.0+)。
提供對(duì)Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
簡(jiǎn)化Druid和HikariCp配置,提供 全局參數(shù)配置 。配置一次,全局通用。
提供 自定義數(shù)據(jù)源來(lái)源 方案。
提供項(xiàng)目啟動(dòng)后 動(dòng)態(tài)增加移除數(shù)據(jù)源 方案。
提供Mybatis環(huán)境下的 純讀寫分離 方案。
提供使用 spel動(dòng)態(tài)參數(shù) 解析數(shù)據(jù)源方案。內(nèi)置spel,session,header,支持自定義。
支持 多層數(shù)據(jù)源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
提供對(duì)shiro,sharding-jdbc,quartz等第三方庫(kù)集成的方案,注意事項(xiàng)和示例。
提供 基于seata的分布式事務(wù)方案。 附:不支持原生spring事務(wù)。
提供 本地多數(shù)據(jù)源事務(wù)方案。 附:不支持原生spring事務(wù)(3.3.1+)。
我們這篇文章主要實(shí)現(xiàn)讀寫分離,一主多從的環(huán)境。
主數(shù)據(jù)庫(kù)建議只執(zhí)行 INSERT、UPDATE、DELETE 操作。
從數(shù)據(jù)庫(kù)建議只執(zhí)行 SELECT 操作。
一、準(zhǔn)備數(shù)據(jù)庫(kù)
主庫(kù):PiaoDB
從庫(kù)1:PiaoDB2
從庫(kù)2:PiaoDB3
二、導(dǎo)入POM文件
引入dynamic-datasource-spring-boot-starter。
<!-- 多數(shù)據(jù)源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.2</version> </dependency>
三、編輯配置文件
我們配置了一個(gè)主庫(kù)、兩個(gè)從庫(kù)。
配置文件中所有以下劃線 _ 分割的數(shù)據(jù)源“首部”即為組的名稱,相同組名稱的數(shù)據(jù)源會(huì)放在一個(gè)組下。
默認(rèn)的數(shù)據(jù)源名稱為 master ,我們可以通過(guò) spring.datasource.dynamic.primary 修改。
spring: datasource: dynamic: primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master strict: false #設(shè)置嚴(yán)格模式,默認(rèn)false不啟動(dòng). 啟動(dòng)后在未匹配到指定數(shù)據(jù)源時(shí)候會(huì)拋出異常,不啟動(dòng)則使用默認(rèn)數(shù)據(jù)源. 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
因?yàn)槲覀兪褂玫氖前⒗飻?shù)據(jù)庫(kù)連接池 Druid,需要排除原生 Druid 的快速配置類。
其他第三方集成地址:集成Druid
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
某些springBoot的版本上面可能無(wú)法排除可用以下方式排除。
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
除了配置一主多從,我們還可以配置。
# 多主多從 純粹多庫(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: h3: oracle_2:
四、編寫代碼
使用 @DS 切換數(shù)據(jù)源。@DS 可以注解在方法上和類上。如果同時(shí)存在,方法注解優(yōu)先于類上注解。強(qiáng)烈建議注解在 service 實(shí)現(xiàn)或 mapper 接口方法上。
@DS("xxx") 指定使用 xxx 這個(gè)數(shù)據(jù)源,xxx 可以為組名也可以為具體某個(gè)庫(kù)的名稱。如果是組名則切換時(shí)采用負(fù)載均衡算法切換。如果指定的組名或者庫(kù)不存在,則自動(dòng)使用默認(rèn)數(shù)據(jù)源(主庫(kù))
如果沒(méi)有 @DS,則使用默認(rèn)數(shù)據(jù)源(主庫(kù))
如果設(shè)置了 @DS 但沒(méi)有指定某個(gè)組或者庫(kù),則根據(jù) DynamicDataSourceStrategy 策略,選擇一個(gè)從庫(kù)。默認(rèn)負(fù)載均衡策略。
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>
五、驗(yàn)證結(jié)果
1、請(qǐng)求新增接口(往主庫(kù)添加數(shù)據(jù)):127.0.0.1:8086/demo/add
2、請(qǐng)求查詢主庫(kù)數(shù)據(jù)接口:127.0.0.1:8086/demo/selectMasterGoodsInfo
3、請(qǐng)求從庫(kù)數(shù)據(jù)接口(負(fù)載均衡):
第一次請(qǐng)求:
第二次請(qǐng)求:
“SpringBoot中如何使用Dynamic Datasource配置多數(shù)據(jù)源”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。