## test1 database
spring.datasource.test1.url=jdbc:mysql://localhost:3307/multipledatasource1?useunicode=true&characterencoding=utf-8&servertimezone=utc&usessl=false
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.driver
## test2 database
spring.datasource.test2.url=jdbc:mysql://localhost:3307/multipledatasource2?useunicode=true&characterencoding=utf-8&servertimezone=utc&usessl=false
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.driver
建立2個資料來源的配置檔案:
第乙個配置檔案:
第二個配置檔案://表示這個類為乙個配置類
@configuration
// 配置mybatis的介面類放的地方
(basepackages =
, sqlsessionfactoryref =
"test1sqlsessionfactory"
)public
class
datasourceconfig1
@bean
(name =
"test1sqlsessionfactory"
)// 表示這個資料來源是預設資料來源
@primary
// @qualifier表示查詢spring容器中名字為test1datasource的物件
public sqlsessionfactory test1sqlsessionfactory
(@qualifier
("test1datasource"
) datasource datasource)
throws exception
@bean
("test1sqlsessiontemplate"
)// 表示這個資料來源是預設資料來源
@primary
public sqlsessiontemplate test1sqlsessiontemplate
(@qualifier
("test1sqlsessionfactory"
) sqlsessionfactory sessionfactory)
}
注意:@configuration
(basepackages =
, sqlsessionfactoryref =
"test2sqlsessionfactory"
)public
class
datasourceconfig2
@bean
(name =
"test2sqlsessionfactory"
)public sqlsessionfactory test2sqlsessionfactory
(@qualifier
("test2datasource"
) datasource datasource)
throws exception
@bean
("test2sqlsessiontemplate"
)public sqlsessiontemplate test2sqlsessiontemplate
(@qualifier
("test2sqlsessionfactory"
) sqlsessionfactory sessionfactory)
}
@primary這個註解必須要加,因為不加的話spring將分不清楚那個為主資料來源(預設資料來源)
在service層中根據不同的業務注入不同的dao層。
如果是主從複製- -讀寫分離:比如test01中負責增刪改,test02中負責查詢。但是需要注意的是負責增刪改的資料庫必須是主庫
如果是分布式結構的話,不同模組操作各自的資料庫就好。test01包下全是test01業務,test02全是test02業務,但是如果test01中摻雜著test02的編輯操作,這時候將會產生事務問題:
簡介:abstractroutingdatasource:這個類是實現多資料來源的關鍵,他的作用就是動態切換資料來源,實質:有多少個資料來源就存多少個資料來源在targetdatasources(是abstractroutingdatasource的乙個map型別的屬性,其中value為每個資料來源,key表示每個資料來源的名字)這個屬性中,然後根據determinecurrentlookupkey()這個方法獲取當前資料來源在map中的key值,然後determinetargetdatasource()方法中動態獲取當前資料來源,如果當前資料來源不存並且預設資料來源也不存在就丟擲異常。
aop:面向切面程式設計,這裡理解為在選擇資料來源的時候進行攔截,然後切換對應的資料來源。
具體實現:
定義乙個動態資料來源:繼承abstractroutingdatasource 抽象類,並重寫determinecurrentlookupkey()方法
建立乙個切換資料來源型別的類: threadlocal為了執行緒的安全性,每個執行緒之間不會相互影響。public
class
dynamicdatasource
extends
abstractroutingdatasource
}
定義多個資料來源:怎麼定義就不多說了,和方法一是一樣的,主要是將定義好的多個資料來源放在動態資料來源中。public
class
datasourcetype
// 使用threadlocal保證執行緒安全
private
static
final threadlocal
type =
newthreadlocal
();// 往當前執行緒裡設定資料來源型別
public
static
void
setdatabasetype
(databasetype databasetype)
system.err.
println
("[將當前資料來源改為]:"
+ databasetype)
; type.
set(databasetype);}
// 獲取資料源型別
public
static databasetype getdatabasetype()
// 清空資料型別
public
static
void
cleardatabasetype()
}
**定義aop:**就是不同業務切換不同資料庫的入口。如果覺得execution太長不願意寫,就可以定義乙個註解來實現。@configuration
(basepackages =
, sqlsessionfactoryref =
"sqlsessionfactory"
)public
class
datasourceconfig
@bean
(name =
"test2datasource"
)@configurationproperties
(prefix =
"spring.datasource.test2"
)public datasource getdatesource2()
@bean
(name =
"dynamicdatasource"
)public dynamicdatasource datasource
(@qualifier
("test1datasource"
) datasource test1datasource,
@qualifier
("test2datasource"
) datasource test2datasource)
@bean
(name =
"sqlsessionfactory"
)public sqlsessionfactory test1sqlsessionfactory
(@qualifier
("dynamicdatasource"
) datasource dynamicdatasource)
throws exception
}
@aspect
@component
public
class
datasourceaop
@before
("execution(* com.mzd.multipledatasources.service..*.test02*(..))"
)public
void
setdatasource2test02()
}
Spring Boot多資料來源配置
方案實現 新建兩個配置類 即加 configuration註解的類 乙個為primarydatasourceconfig,用來配置本專案的資料來源 另乙個叫seconddatasourceconfig,用來配置需要同步的資料來源。如下 configuration public class prima...
SpringBoot配置多資料來源
專案中用到了兩個資料庫,分別是oracle和mysql,涉及到了多資料來源問題,這裡做下記錄 官方講解 日誌jdbc配置 druid常見問題彙總 spring datasource type com.alibaba.druid.pool.druiddatasource base type com.a...
springboot多資料來源配置
多資料來源配置主要用到spring的abstractroutingdatasource,網上介紹資料也有很多,這裡主要做個備份 除了資料庫連線的依賴,spring的依賴,mybatis的依賴之外還需要 com.alibaba druid spring boot starter 1.1.5 使用com...