電子商城網(wǎng)站開發(fā)品牌推廣的三個(gè)階段
代碼地址
碼云地址 | springboot根據(jù)租戶id動(dòng)態(tài)指定數(shù)據(jù)源: springboot根據(jù)租戶id指定動(dòng)態(tài)數(shù)據(jù)源,結(jié)合mybatis+mysql+多數(shù)源下的事務(wù)管理 |
創(chuàng)建3個(gè)數(shù)據(jù)庫(kù)和對(duì)應(yīng)的表
sql腳本在下圖位置
代碼的執(zhí)行順序
- 先設(shè)置主數(shù)據(jù)庫(kù)的數(shù)據(jù)源
- 配置目標(biāo)數(shù)據(jù)源和默認(rèn)數(shù)據(jù)源
- 有了主庫(kù)的數(shù)據(jù)源,才能讀取主數(shù)據(jù)庫(kù)配置的所有數(shù)據(jù)源,重新初始化數(shù)據(jù)源并放入ioc容器中
- 在訪問service方法之前,先攔截到aop中,把請(qǐng)求頭中的租戶id,放入本地線程上下文中
- 在調(diào)用mapper接口的時(shí)候,跳轉(zhuǎn)到自定義的數(shù)據(jù)源對(duì)應(yīng)的determineCurrentLookupKey() 方法中,動(dòng)態(tài)切換租戶id下的數(shù)據(jù)源
- 拿到結(jié)果打印
aa方法,在header頭中輸入對(duì)應(yīng)的租戶id
?可以看到對(duì)應(yīng)的租戶01對(duì)應(yīng)的數(shù)據(jù)庫(kù)下的表的數(shù)據(jù) 打印出來了
輸入租戶02,可以看到租戶02對(duì)應(yīng)數(shù)據(jù)庫(kù)下的表的數(shù)據(jù)打印出來了
?
執(zhí)行addBiao方法,輸入對(duì)應(yīng)的租戶id
?可以看到租戶2的數(shù)據(jù)庫(kù)中,王五并沒有被插入,說明多數(shù)據(jù)源下的事務(wù)生效了,已經(jīng)回滾數(shù)據(jù)了
注意?
aop的執(zhí)行順序,一定要比事務(wù)管理器的順序要優(yōu)先,否則事務(wù)不會(huì)生效
如果不設(shè)置Order注解,那么事務(wù)就不會(huì)拿到,DataSourceContextHolder設(shè)置的上下文中的租戶id
到了動(dòng)態(tài)數(shù)據(jù)源的方法中,就會(huì)獲取數(shù)據(jù)源為null,也就是lookupKey為null