SpringBoot配置多資料來源

2021-10-01 15:37:35 字數 4914 閱讀 2842

## 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()方法

public

class

dynamicdatasource

extends

abstractroutingdatasource

}

建立乙個切換資料來源型別的類: threadlocal為了執行緒的安全性,每個執行緒之間不會相互影響。

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()

}

定義多個資料來源:怎麼定義就不多說了,和方法一是一樣的,主要是將定義好的多個資料來源放在動態資料來源中。

@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

}

**定義aop:**就是不同業務切換不同資料庫的入口。如果覺得execution太長不願意寫,就可以定義乙個註解來實現。

@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...