MybatisPlus多資料來源及事務解決思路
阿新 • • 發佈:2021-01-19
# 關於多資料來源解決方案
目前在`SpringBoot`框架基礎上多資料來源的解決方案大多手動建立多個` DataSource `,後續方案有三:
1. 繼承`org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource`,使用`AOP`切面注入相應的資料來源 ,但是這種做法僅僅適用單`Service`方法使用一個數據源可行,如果單`Service`方法有多個數據源執行會造成誤讀。
2. 通過` DataSource `配置 `JdbcTemplate`Bean,直接使用 `JdbcTemplate`操控資料來源。
3. 分別通過` DataSource `建立`SqlSessionFactory`並掃描相應的`Mapper`檔案和`Mapper`介面。
![MybatisPlus](https://www.zuoyu.top/upload/2020/06/relationship-with-mybatis-0b0caf16ec9d4e93ab8779660315c670.png)
# `MybatisPlus`的多資料來源
我通過閱讀原始碼,發現`MybatisPlus`的多資料來源解決方案正是`AOP`,繼承了`org.springframework.jdbc.datasource.AbstractDataSource`,有自己對`ThreadLocal`的處理。通過註解切換資料來源。也就是說,`MybatisPlus`只支援在單`Service`方法內操作一個數據源,畢竟官網都指明——**“強烈建議只註解在service實現上”**。
而後,注意看`com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder`,也就是`MybatisPlus`是如何切換資料來源的。
重點看:
```java
/**
* 為什麼要用連結串列儲存(準確的是棧)
*
* 為了支援巢狀切換,如ABC三個service都是不同的資料來源 * 其中A的某個業務要調B的方法,B的方法需要呼叫C的方法。一級一級呼叫切換,形成了鏈。 * 傳統的只設置當前執行緒的方式不能滿足此業務需求,必須模擬棧,後進先出。 **/ private static final Thr