項目中須要根據不一樣業務進行分庫,首先是將業務不一樣業務映射到不一樣過的數據庫( biz --> db,可能存在多對一狀況),spring
查看springjdbc源碼發現AbstractRoutingDataSource類做爲一個數據源路由抽象類,能夠擔當這個事情,其設計思想也比較簡單,sql
首先將多個數據源的映射關係本身維護完成後注入進來,而後本身定義一個路由規則,重點部分見代碼:數據庫
首先能夠看到該類是一個抽象類,重點關注變量targetDataSource和resolvedDataSources.安全
其中targetDataSource用於將用戶創建的映射關係注入進來,能夠經過以下方法線程
resolvedDataSources用於真正存儲依賴關係,targetDataSource僅僅是個中介,解析代碼見下圖設計
核心路由方法:3d
是否是很清楚,首先獲取數據源映射key,而後經過key獲取數據源blog
數據源映射獲取方法爲抽象方法,見下圖:路由
實現時須要注意線程安全,最佳實現時經過ThreadLocal將在dbsql執行前將key設置進去,以便後來獲取這個key,get
調用入口: