完整的項目示例地址:https://gitee.com/learnhow/shardingsphere/tree/v1.1/jdbc
緊接上一篇文章,這次我們介紹綁定表的概念。
綁定表指分片規則一致的主表和子表。綁定表之間的多表關聯查詢不會出現笛卡爾積關聯,關聯查詢效率將大大提升。簡而言之,在互為綁定表上進行的查詢操作只會在一個庫中進行。綁定表的關鍵是各表的分片算法一致,在插入數據的時候才能夠保證講相同策略的多表數據插入到同一個庫中。
1.分片配置
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order spring.shardingsphere.rules.sharding.tables.t_order_item.actual-data-modes=ds$->{0..1}.t_order_item spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=order_id spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-algorithm-name=database-inline spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-column=order_id spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-algorithm-name=database-inline spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type=INLINE spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression=ds$->{order_id % 2}
2.綁定表配置
spring.shardingsphere.rules.sharding.binding-tables[0]=t_order,t_order_item
如果采用snowflake作為主鍵生成策略並作為分片鍵,我們需要一個外部的算法依賴。
package com.yet.shardingshere.jdbc.conf; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.net.NetUtil; import cn.hutool.core.util.IdUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class IdGenerator { /** * 1號機器 0-31 */ @Value("${customize.node-id}") private long nodeId = 1; private Snowflake snowflake; @PostConstruct public void init() { long workerId = 0; try { workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr()) % 32; } catch (Exception e) { e.printStackTrace(); workerId = NetUtil.getLocalhostStr().hashCode() % 32; } snowflake = IdUtil.createSnowflake(workerId, nodeId); } public synchronized long snowflakeId() { return snowflake.nextId(); } }
附錄1.配置項說明
spring.shardingsphere.datasource.names= # 省略數據源配置,請參考使用手冊 # 標准分片表配置 spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes= # 由數據源名 + 表名組成,以小數點分隔。多個表以逗號分隔,支持inline表達式。缺省表示使用已知數據源與邏輯表名稱生成數據節點,用於廣播表(即每個庫中都需要一個同樣的表用於關聯查詢,多為字典表)或只分庫不分表且所有庫的表結構完全一致的情況 # 分庫策略,缺省表示使用默認分庫策略,以下的分片策略只能選其一 # 用於單分片鍵的標准分片場景 spring.shardingsphere.rules.sharding.tables.<table-name>.database-strategy.standard.<sharding-algorithm-name>.sharding-column= # 分片列名稱 spring.shardingsphere.rules.sharding.tables.<table-name>.database-strategy.standard.<sharding-algorithm-name>.sharding-algorithm-name= # 分片算法名稱 # 用於多分片鍵的復合分片場景 spring.shardingsphere.rules.sharding.tables.<table-name>.database-strategy.complex.<sharding-algorithm-name>.sharding-columns= # 分片列名稱,多個列以逗號分隔 spring.shardingsphere.rules.sharding.tables.<table-name>.database-strategy.complex.<sharding-algorithm-name>.sharding-algorithm-name= # 分片算法名稱 # 用於Hint 的分片策略 spring.shardingsphere.rules.sharding.tables.<table-name>.database-strategy.hint.<sharding-algorithm-name>.sharding-algorithm-name= # 分片算法名稱 # 分表策略,同分庫策略 spring.shardingsphere.rules.sharding.tables.<table-name>.table-strategy.xxx= # 省略 # 自動分片表配置 spring.shardingsphere.rules.sharding.auto-tables.<auto-table-name>.actual-data-sources= # 數據源名 spring.shardingsphere.rules.sharding.auto-tables.<auto-table-name>.sharding-strategy.standard.sharding-column= # 分片列名稱 spring.shardingsphere.rules.sharding.auto-tables.<auto-table-name>.sharding-strategy.standard.sharding-algorithm= # 自動分片算法名稱 # 分布式序列策略配置 spring.shardingsphere.rules.sharding.tables.<table-name>.key-generate-strategy.column= # 分布式序列列名稱 spring.shardingsphere.rules.sharding.tables.<table-name>.key-generate-strategy.key-generator-name= # 分布式序列算法名稱 spring.shardingsphere.rules.sharding.binding-tables[0]= # 綁定表規則列表 spring.shardingsphere.rules.sharding.binding-tables[1]= # 綁定表規則列表 spring.shardingsphere.rules.sharding.binding-tables[x]= # 綁定表規則列表 spring.shardingsphere.rules.sharding.broadcast-tables[0]= # 廣播表規則列表 spring.shardingsphere.rules.sharding.broadcast-tables[1]= # 廣播表規則列表 spring.shardingsphere.rules.sharding.broadcast-tables[x]= # 廣播表規則列表 spring.shardingsphere.sharding.default-database-strategy.xxx= # 默認數據庫分片策略 spring.shardingsphere.sharding.default-table-strategy.xxx= # 默認表分片策略 spring.shardingsphere.sharding.default-key-generate-strategy.xxx= # 默認分布式序列策略 # 分片算法配置 spring.shardingsphere.rules.sharding.sharding-algorithms.<sharding-algorithm-name>.type= # 分片算法類型 spring.shardingsphere.rules.sharding.sharding-algorithms.<sharding-algorithm-name>.props.xxx=# 分片算法屬性配置 # 分布式序列算法配置 spring.shardingsphere.rules.sharding.key-generators.<key-generate-algorithm-name>.type= # 分布式序列算法類型 spring.shardingsphere.rules.sharding.key-generators.<key-generate-algorithm-name>.props.xxx= # 分布式序列算法屬性配置