springBoot(六) 調用多數據源 dynamic-datasource

1 dynamic-datasource簡介

  • 本框架只做 切換數據源 這件核心的事情,並不限制您的具體操作。
  • 強烈建議在 主從模式
  • 下遵循普遍的規則,以便他人能更輕易理解您的代碼。
  • 主數據庫 建議 只執行 INSERT UPDATE DELETE 操作。
  • 從數據庫 建議 只執行 SELECT 操作。

2 使用方法

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

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.6</version>
        </dependency>

2.2 spring boot 配置(yml)

一主多從方案

spring:
  datasource:
    dynamic:
      primary: master #設置默認的數據源或者數據源組,默認值即爲master,如果你主從默認下主庫的名稱就是master可不定義此項。
      datasource:
        master:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://47.xxx.xx.xxx:3306/dynamic?characterEncoding=utf8&useSSL=false
        slave_1:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://47.xxx.xx.xxx:3307/dynamic?characterEncoding=utf8&useSSL=false
        slave_2:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://47.xxx.xx.xxx:3308/dynamic?characterEncoding=utf8&useSSL=false
       #......省略
       #以上會配置一個默認庫master,一個組slave下有兩個子庫slave_1,slave_2

多主多從方案

spring:
  datasource:
    dynamic:
      datasource:
        master_1:
        master_2:
        slave_1:
        slave_2:
        slave_3:

多數據庫方案

spring:
  datasource:
    dynamic:
      primary: mysql #記得設置一個默認數據源
      datasource:
        mysql:
        oracle:
        sqlserver: 
        h2:

3 使用註解

3.1 註解介紹

@DS 可以註解在方法上和類上,同時存在方法註解優先於類上註解,強烈建議註解在service實現或mapper接口方法上。

注意從2.0.0 不再支持@DS空註解 ,您 必須 指明你所需要的數據庫 組名 或者 具體某個數據庫名稱 。

註解 結果
沒有@DS 默認數據源
@DS(“dsName”) dsName可以爲組名也可以爲具體某個庫的名稱

註解可以使用在sevice 和 mapper 層, 可以用在方法個類上

4 繼承druid

springBoot 2.x默認是使用HikariCP的, 所以覺得HikariCP的可以不需要換Druid,因爲國內用多還是寫一下

**注意:**主從可以使用不同的數據庫連接池,如master使用Druid監控,從庫使用HikariCP。 如果不配置連接池type類型,默認是Druid優先於HikariCP。

4.1 排除原生的Druid配置

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

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

4.2 導入druid包之後配置yml

spring:
  datasource:
    druid:
      stat-view-servlet:
        loginUsername: root
        loginPassword: root
    dynamic:
      datasource:
        master:
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://120.xxx.xxx.xxx:3316/aaaa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          druid: #以下均爲默認值
            initial-size: 3
            max-active: 8
            min-idle: 2
            max-wait: -1
            min-evictable-idle-time-millis: 30000
            max-evictable-idle-time-millis: 30000
            time-between-eviction-runs-millis: 0
            validation-query: select 1
            validation-query-timeout: -1
            test-on-borrow: false
            test-on-return: false
            test-while-idle: true
            pool-prepared-statements: true
            max-open-prepared-statements: 100
            filters: stat,wall
            share-prepared-statements: true
        slave_1:
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://120.xx.xx.xxx:3317/aaaa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          druid: #以下均爲默認值
            initial-size: 3
            max-active: 8
            min-idle: 2
            max-wait: -1
            min-evictable-idle-time-millis: 30000
            max-evictable-idle-time-millis: 30000
            time-between-eviction-runs-millis: 0
            validation-query: select 1
            validation-query-timeout: -1
            test-on-borrow: false
            test-on-return: false
            test-while-idle: true
            pool-prepared-statements: true
            max-open-prepared-statements: 100
            filters: stat,wall
            share-prepared-statements: true

小結

  • 在項目不打的時候可以使用這個,但是一旦數據庫多了,那麼用dynamic-datasource 就會導致後期維護十分麻煩所以業務十分大建議使用 sharding-jdbc
  • 一定要記得需要將原生的Druid的配置 隔離掉
  • 數據庫主從分離要做好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章