動態多源資料庫架構實現

2021-10-01 06:57:41 字數 3885 閱讀 8165

備註想要完成動態資料來源,需要以下幾個步驟:

建立乙個主資料庫和幾個動態資料庫,其中主資料庫裡只儲存路由表data_source(內容是儲存其他資料庫的配置資訊),動態資料庫儲存其他所有的業務實現表,如:user等;

增加乙個執行緒上下文的靜態類databasesourcecontextholder,實現setdatasourcetype、getdatasourcetype、cleardatasourcetype三個靜態方法;

import

...@transactional

@service

("databaseservice"

)public

class

databasesourceserviceimpl

implements

databasesourceservice

}

import

.../**

* created by rocker on 16-12-15.

*/public

class

dynamicdatabasesource

extends

abstractroutingdatasource

implements

@override

public

void

afterpropertiesset()

catch

(exception e)

super

.afterpropertiesset()

;}public

void

context = ctx;

}public

() throws bean***ception

private

void

initdatasources

() throws sqlexception

//初始化容器動態資料來源列表

this

.settargetdatasources

(targetdatasources)

;//覆蓋原有sqlsessionfactory

bdb = beandefinitionbuilder.

rootbeandefinition

(sqlsessionfactorybean.

class);

bdb.

getbeandefinition()

.setattribute

("id"

,"sqlsessionfactory");

bdb.

addpropertyreference

("datasource"

,"dynamicdatasource");

bdb.

addpropertyvalue

("configlocation"

,"classpath:mybatis.cfg.xml");

bdb.

addpropertyvalue

("typealiasespackage"

,"com.***.api.entity");

bdb.

addpropertyvalue(,

);defaultfactory.

registerbeandefinition

("sqlsessionfactory"

, bdb.

getbeandefinition()

);//覆蓋原有scannerconfigurer

bdb = beandefinitionbuilder.

rootbeandefinition

class);

bdb.

getbeandefinition()

.setattribute

("id"

,"scannerconfigurer");

bdb.

addpropertyvalue

("basepackage",)

; bdb.

addpropertyvalue

("sqlsessionfactorybeanname"

,"sqlsessionfactory");

defaultfactory.

registerbeandefinition

("scannerconfigurer"

, bdb.

getbeandefinition()

);//覆蓋原有txmanager

bdb = beandefinitionbuilder.

rootbeandefinition

(datasourcetransactionmanager.

class);

bdb.

getbeandefinition()

.setattribute

("id"

,"txmanager");

bdb.

addpropertyreference

("datasource"

,"dynamicdatasource");

defaultfactory.

registerbeandefinition

("txmanager"

, bdb.

getbeandefinition()

);}}

import

...public

class

databasesourcecontextholder

public

static string getdatasourcetype()

public

static

void

cleardatasourcetype()

}

import

...@path

("user"

)@service

("userservice"

)@consumes()

@produces()

public

class

userserviceimpl

implements

userservice

}

classpath:datasource.properties

欄位名

型別長度

idint11

beanid

varchar50

drivername

varchar50

urlvarchar256

username

varchar25

password

varchar25

initmethodname

varchar50

destroymethodname

varchar50

欄位名型別

長度id

int11

username

varchar50

password

varchar50

account

double0

sourceid

int11

以後有時間會上傳**到github。

資料庫架構多活相關設計

可以考慮如下架構 同機房 互為主備,同城機房 設定為單向從 異地機房 設定為單向從 keepalived 採用單播模式,可以直接控制同機房的兩台資料庫,同城機房的資料庫。異地機房資料庫重新建立連線可以採用動態修改資料庫配置,採用統一註冊中心推送配置方式。主 主 從 從 單播模式 keepalived...

springboot 實現引數切換資料庫源

實現乙個中英文切換的國際化需求,考慮到springboot國際化只能配置靜態資料翻譯,考慮使用分庫進行資料分開儲存,避免 邏輯大量修改.記錄一下實現思路.yml配置檔案,配置兩個資料來源 spring datasource dynamic primary cn datasource cn drive...

資料庫架構

很少談架構方面的事情,主要是因為這確實是個對知識面和知識深度要求很高的領域,無論是開發語言的選擇 的架構,伺服器的搭配 網路的架構 資料庫的架構還是第三方軟體的選用等,每一方面都是個很大的方向,每個方向都值得乙個人去研究一輩子 每每看到某某 的首席架構師之類的人 不過很多是海綿派 總覺得那就是樂於做...