一、前言🔥
環境說明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
? ? ? ? 正常情況下我們在開發系統的時候都是使用一個數據源,但是由于有些項目同步數據的時候不想造成數據庫io消耗壓力過大,便會一個項目對應多個數據源,即就會有個問題,Springboot?配置db都是默認加載數據源連接,連接池默認配置,但是配置多個數據庫url,這該怎么實現呢?
? ? ? ? 不用擔心,我們就是為了解決而寫的,不用復雜的實現方式,什么Springboot+mybatis在配置文件中配置多個數據源,然后mapper指定連接配置等,不,不需要,我嫌太麻煩了,今天我就要給你們安利它:?**dynamic-datasource-spring-boot-starter,一個基于springboot的快速集成多數據源的啟動器,開箱即用,超級方便。**接下來我就為大家一一講解,雖然配置很簡單,但是坑也比較多,bug菌都為大家給淌過啦,你們就直接直接拿去用即可!
二、dynamic-datasource-spring-boot-starter
一、簡介
dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數據源的啟動器。
其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x。
二、特性
- 支持 數據源分組 ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 支持數據庫敏感配置信息 加密 ENC()。
- 支持每個數據庫獨立初始化表結構schema和數據庫database。
- 支持無數據源啟動,支持懶加載數據源(需要的時候再創建連接)。
- 支持 自定義注解 ,需繼承DS(3.2.0+)。
- 提供并簡化對Druid,HikariCp,BeeCp,Dbcp2的快速集成。
- 提供對Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等組件的集成方案。
- 提供 自定義數據源來源 方案(如全從數據庫加載)。
- 提供項目啟動后 動態增加移除數據源 方案。
- 提供Mybatis環境下的 純讀寫分離 方案。
- 提供使用 spel動態參數 解析數據源方案。內置spel,session,header,支持自定義。
- 支持 多層數據源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供 **基于seata的分布式事務方案。
- 提供 本地多數據源事務方案。
三、使用方法
1、老規矩,先引依賴包。引入dynamic-datasource-spring-boot-starter;
<!--配置多數據源-->
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version>
</dependency>
2、配置數據源。
spring:datasource:dynamic:primary: master #設置默認的數據源或者數據源組,默認值即為masterstrict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源datasource:master:driver-class-name: com.mysql.cj.jdbc.Driver #3.2.0開始支持SPI可省略此配置url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456slave_1:driver-class-name: com.mysql.cj.jdbc.Driver #3.2.0開始支持SPI可省略此配置url: jdbc:mysql://127.0.0.1:3306/test_db2?setUnicode=true&characterEncoding=utf8username: rootpassword: 123456
拓展:同時也支持多主多從,多種不同庫及混合配置。
3、實戰演示:
我們先來指定配置環境:
配置好配置環境后,先啟動下項目,查看庫是否都正常連接。如下控制臺啟動打印的日志,表示兩庫都正常連接。
接著,我們先創建兩個實體,分別對應db1和db2的user表:
接著寫一個controller類;
接著接口實現層:
這里我就為大家講解一下了。
數據源切換,使用的是提供的?@DS?注解。
其中@DS 可以注解在方法上或類上,同時存在就近原則 方法上注解 優先于 類上注解。(所以你們看上邊,注解在類上使用的是主庫,但是基于下邊某個方法就是制定了從庫,但是我這樣放一起是為了給大家看比較,一般會直接分類寫,不會一個類上出現多個數據源。)
注:@DS("dsName")? ?dsName可以為組名也可以為具體某個庫的名稱。
4、訪問接口查看結果。
先是訪問接口1:localhost:8888/dbUser/query-users-for-db-one
如下請求結果,大家請看,成功拿到了db1庫中的數據。
再請求下接口2:localhost:8888/dbUser/query-users-for-db-two
如下請求結果,大家請看,成功拿到了db2庫中的數據。
再做個測試,我們把db1與db2中的數據同時返回,看看能否成功:
我們先寫兩接口,然后分別將數據用map返回:
請求結果如下:
然后給大家看下數據庫數據,以免被大家說是同一個庫中的數據。
好啦,以上就是同mysql數據源的配置流程及實例演示啦,如果還有啥不清楚的小伙伴,歡迎下方留言。接著就是針對后邊兩種配置方式,就自行嘗試啦,看上去都是一樣的。
有需求的小伙伴,看完之后,使用起來是不是很簡單,壓根不需要用傳統的mybatis配置多個連接器,mybatis-plus都幫我們封裝好啦,開箱即用。