主要過程包括:
- 分庫分表的路由定位
- sql語句的 ast 抽象語法樹的解析
- 通過自定義 SQLASTVisitor (MySQLSelectASTVisitor) 遍歷sql ast,解析出邏輯表名
- 查詢邏輯表名對應的分庫分表規則
- 根據邏輯表的分庫分表規則,遍歷sql ast定位分片鍵的值 根據中介軟體的設計需要支援分庫分表語句的各種sql場景,遍歷ast樹,做一堆if else判斷 (分庫分表後,不應該支援複雜的sql,可酌情考慮公司業務場景 需要支援的sql語句 來遍歷 sql樹)
- SqlRewrite#rewrite 改寫 sql語句,根據邏輯表的分庫分表規則和分片鍵的值,將邏輯表名改寫成目標物理表名; 改寫後的sql即為在目標分庫中執行的真實SQL 改寫sql的過程也是利用 SQLASTVisitor 來操作的,不過用的自定義的 ShardRewriteTableOutputVisitor (繼承輸出型visitor:SQLASTOutputVisitor)來遍歷 sql tree 輸出sql字串, 遇到 SQLExprTableSource 節點的時候改寫表名
- 路由到目標的分庫和分表 可能是多個庫和表, #reWriteAndMergeParams 會把sql引數塞到所有重寫後的的分表sql語句中
- 後面再執行的時候 會根據 路由結果是不是多個分庫,按照配置單庫併發度 concurrencyLevel (預設是1)來決定在每個目標分庫中不同表的sql是用一個java 執行緒還是多個java執行緒並行執行, 具體過程 參考 如果定位到多個分庫表怎麼執行的?
完整目錄:資料庫中介軟體zebra原始碼分析