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的配置 隔離掉
- 數據庫主從分離要做好