備註想要完成動態資料來源,需要以下幾個步驟:
建立乙個主資料庫和幾個動態資料庫,其中主資料庫裡只儲存路由表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
欄位名
型別長度
idint
11
beanid
varchar
50
drivername
varchar
50
urlvarchar
256
username
varchar
25
password
varchar
25
initmethodname
varchar
50
destroymethodname
varchar
50
欄位名型別
長度id
int
11
username
varchar
50
password
varchar
50
account
double
0
sourceid
int
11
以後有時間會上傳**到github。
資料庫架構多活相關設計
可以考慮如下架構 同機房 互為主備,同城機房 設定為單向從 異地機房 設定為單向從 keepalived 採用單播模式,可以直接控制同機房的兩台資料庫,同城機房的資料庫。異地機房資料庫重新建立連線可以採用動態修改資料庫配置,採用統一註冊中心推送配置方式。主 主 從 從 單播模式 keepalived...
springboot 實現引數切換資料庫源
實現乙個中英文切換的國際化需求,考慮到springboot國際化只能配置靜態資料翻譯,考慮使用分庫進行資料分開儲存,避免 邏輯大量修改.記錄一下實現思路.yml配置檔案,配置兩個資料來源 spring datasource dynamic primary cn datasource cn drive...
資料庫架構
很少談架構方面的事情,主要是因為這確實是個對知識面和知識深度要求很高的領域,無論是開發語言的選擇 的架構,伺服器的搭配 網路的架構 資料庫的架構還是第三方軟體的選用等,每一方面都是個很大的方向,每個方向都值得乙個人去研究一輩子 每每看到某某 的首席架構師之類的人 不過很多是海綿派 總覺得那就是樂於做...