Sharding-JDBC 核心之路由引擎
路由引擎
無論是分庫分表、還是讀寫分離,一個SQL在DB上執行前都需要經過特定規則運算獲得執行的目標庫表資訊。路由引擎的職責定位就是計算SQL應該在哪個資料庫、哪個表上執行。前者結果會傳給後續執行引擎,然後根據其資料庫標識獲取對應的資料庫連線;後者結果則會傳給改寫引擎在SQL執行前進行表名的改寫,即替換為正確的物理表名。計算哪個資料庫依據的演算法是要使用者配置的庫路由規則,計算哪個表依據的演算法是使用者配置的表路由規則。目前在ShardingSphere中需要進行路由的功能模組有兩個:先處理分庫分表sharding再處理讀寫分離master-slave。根據解析上下文匹配資料庫和表的分片策略,並生成路由路徑。 對於攜帶分片鍵的SQL,根據分片鍵的不同可以劃分為單片路由(分片鍵的操作符是等號)、多片路由(分片鍵的操作符是IN)和範圍路由(分片鍵的操作符是BETWEEN)。不攜帶分片鍵的SQL則採用廣播路由。
路由引擎的整體結構劃分如下圖。
一、分片路由
用於根據分片鍵進行路由的場景,又細分為直接路由、標準路由和笛卡爾積路由這3種型別。1.1 直接路由
滿足直接路由的條件相對苛刻,它需要通過Hint(使用HintAPI直接指定路由至庫表)方式分片,並且是隻分庫不分表的前提下,則可以避免SQL解析和之後的結果歸併。 因此它的相容性最好,可以執行包括子查詢、自定義函式等複雜情況的任意SQL。直接路由還可以用於分片鍵不在SQL中的場景。例如,設定用於資料庫分片的鍵為3 hintManager.setDatabaseShardingValue(3);
假如路由演算法為value % 2,當一個邏輯庫t_order對應2個真實庫t_order_0和t_order_1時,路由後SQL將在t_order_1上執行。下方是使用API的程式碼樣例:
String sql = "SELECT * FROM t_order";
try (
HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
hintManager.setDatabaseShardingValue(3);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
//...
}
}
}
1.2 標準路由
標準路由是ShardingSphere最為推薦使用的分片方式,它的適用範圍是不包含關聯查詢或僅包含繫結表之間關聯查詢的SQL。 當分片運算子是等於號時,路由結果將落入單庫(表),當分片運算子是BETWEEN或IN時,則路由結果不一定落入唯一的庫(表),因此一條邏輯SQL最終可能被拆分為多條用於執行的真實SQL。 舉例說明,如果按照order_id的奇數和偶數進行資料分片,一個單表查詢的SQL如下: SELECT * FROM t_order WHERE order_id IN (1, 2);
二、廣播路由
相關文章
- SPA 路由三部曲之核心原理路由
- Sharding-JDBC 原始碼之 SQL 解析JDBC原始碼SQL
- 57_初識搜尋引擎_分散式搜尋引擎核心解密之query phase分散式解密
- SOFARegistry 原始碼|資料分片之核心-路由表 SlotTable 剖析原始碼路由
- 深入V8引擎-Time核心方法之mac篇Mac
- Sharding-JDBC 原始碼之啟動流程分析JDBC原始碼
- 深入V8引擎-Time核心方法之win篇(2)
- 深入V8引擎-Time核心方法之win篇(1)
- Laravel核心程式碼學習 — 路由Laravel路由
- Laravel核心程式碼學習 -- 路由Laravel路由
- PHP 模板引擎用到的核心方法PHP
- 瀏覽器核心渲染:重建引擎瀏覽器
- 「譯」JS 引擎核心: 原型優化JS原型優化
- DIY 實現 ThinkPHP 核心框架 (三)路由PHP框架路由
- Linux核心之 核心同步Linux
- 主流瀏覽器核心及JS引擎瀏覽器JS
- Dubbo 路由規則之標籤路由路由
- 56_初識搜尋引擎_核心級知識點之doc value初步探秘
- 用 GoLang 編寫類似 Apache Camel 路由引擎GolangApache路由
- OA軟體的核心:工作流引擎
- 瀏覽器核心渲染引擎工作流程瀏覽器
- MaxCompute執行引擎核心技術DAG揭秘
- Sharding-JDBC測試ChatGPTJDBCChatGPT
- 開源搜尋技術的核心引擎 —— Lucene
- Java模板引擎之FreeMarkerJava
- Clickhouse表引擎之MergeTree
- AngularJS核心之DirectiveAngularJS
- 跨平臺渲染引擎之路:框架與核心模組框架
- 瀏覽器之渲染引擎瀏覽器
- Flutter之引擎啟動流程Flutter
- InnoDB引擎之flush髒頁
- MySQL之四 儲存引擎MySql儲存引擎
- 資料庫中介軟體 Sharding-JDBC 原始碼分析 —— 事務(一)之BED資料庫JDBC原始碼
- Sharding-Jdbc學習筆記一之讀寫分離mysql安裝篇JDBC筆記MySql
- Sharding-Jdbc學習筆記二之讀寫分離專案配置篇JDBC筆記
- 履約核心引擎低程式碼化原理與實踐
- Sharding-JDBC分片策略詳解(二)JDBC
- 八、路由詳細介紹之動態路由OSPF(重點)路由