注:本文的多數據源配置及切換的實現方法是,在框架中封裝,具體項目中配置及使用,也適用於多模塊項目
配置文件數據源讀取
通過springboot的Envioment和Binder對象進行讀取,無需手動聲明DataSource的Bean
yml數據源配置格式如下:
spring: datasource: master: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/main? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111 cluster: - key: db1 type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/haopanframetest_db1? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111 - key: db2 type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/haopanframetest_db2? useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: root password: 11111
master為主數據庫必須配置,cluster下的為從庫,選擇性配置
獲取配置文件信息代碼如下
動態加入數據源
定義獲取數據源的Service,具體項目中進行實現
獲取對應Service的所有實現類進行調用
通過代碼進行數據源注冊
主要是用過繼承類AbstractRoutingDataSource,重寫setTargetDataSources/setDefaultTargetDataSource方法
通過切面注解統一切換
定義注解
定義基於線程的切換類
定義切面
方法的注解優先級高於類注解,一般用於Service的實現類
分庫切換
開發過程中某個庫的某個表做了拆分操作,相同的某一次數據庫操作可能對應到不同的庫,需要對方法級別進行精確攔截,可以定義一個業務層面的切面,規定每個方法必須第一個參數為dbName,根據具體業務找到對應的庫傳參