代碼地址
碼云地址 | springboot根據租戶id動態指定數據源: springboot根據租戶id指定動態數據源,結合mybatis+mysql+多數源下的事務管理 |
創建3個數據庫和對應的表
sql腳本在下圖位置
代碼的執行順序
- 先設置主數據庫的數據源
- 配置目標數據源和默認數據源
- 有了主庫的數據源,才能讀取主數據庫配置的所有數據源,重新初始化數據源并放入ioc容器中
- 在訪問service方法之前,先攔截到aop中,把請求頭中的租戶id,放入本地線程上下文中
- 在調用mapper接口的時候,跳轉到自定義的數據源對應的determineCurrentLookupKey() 方法中,動態切換租戶id下的數據源
- 拿到結果打印
aa方法,在header頭中輸入對應的租戶id
?可以看到對應的租戶01對應的數據庫下的表的數據 打印出來了
輸入租戶02,可以看到租戶02對應數據庫下的表的數據打印出來了
?
執行addBiao方法,輸入對應的租戶id
?可以看到租戶2的數據庫中,王五并沒有被插入,說明多數據源下的事務生效了,已經回滾數據了
注意?
aop的執行順序,一定要比事務管理器的順序要優先,否則事務不會生效
如果不設置Order注解,那么事務就不會拿到,DataSourceContextHolder設置的上下文中的租戶id
到了動態數據源的方法中,就會獲取數據源為null,也就是lookupKey為null