定位爲輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解爲加強版的JDBC驅動,徹底兼容JDBC和各類ORM框架。node
- 適用於任何基於JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
- 支持任何第三方的數據庫鏈接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
- 支持任意實現JDBC規範的數據庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標準的數據庫。
配置說明
#### 經常使用配置 spring.shardingsphere.datasource.names= #數據源名稱,多數據源以逗號分隔 spring.shardingsphere.sharding.tables.<logic-table-name>.actual-data-nodes= #由數據源名 + 表名組成,以小數點分隔。多個表以逗號分隔,支持inline表達式。缺省表示使用已知數據源與邏輯表名稱生成數據節點。用於廣播表(即每一個庫中都須要一個一樣的表用於關聯查詢,多爲字典表)或只分庫不分表且全部庫的表結構徹底一致的狀況 ##### 分庫策略,缺省表示使用默認分庫策略,如下的分片策略只能選其一 ##### 用於單分片鍵的標準分片場景 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.sharding-column= #分片列名稱 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.precise-algorithm-class-name= #精確分片算法類名稱,用於=和IN。該類需實現PreciseShardingAlgorithm接口並提供無參數的構造器 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.range-algorithm-class-name= #範圍分片算法類名稱,用於BETWEEN,可選。該類需實現RangeShardingAlgorithm接口並提供無參數的構造器 ##### 用於多分片鍵的複合分片場景 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.complex.sharding-columns= #分片列名稱,多個列以逗號分隔 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.complex.algorithm-class-name= #複合分片算法類名稱。該類需實現ComplexKeysShardingAlgorithm接口並提供無參數的構造器 ##### 行表達式分片策略 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.inline.sharding-column= #分片列名稱 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.inline.algorithm-expression= #分片算法行表達式,需符合groovy語法 ##### Hint分片策略 spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.hint.algorithm-class-name= #Hint分片算法類名稱。該類需實現HintShardingAlgorithm接口並提供無參數的構造器 ##### 分表策略,同分庫策略 spring.shardingsphere.sharding.tables.<logic-table-name>.table-strategy.xxx= #省略 spring.shardingsphere.sharding.tables.<logic-table-name>.key-generator.column= #自增列名稱,缺省表示不使用自增主鍵生成器 spring.shardingsphere.sharding.tables.<logic-table-name>.key-generator.type= #自增列值生成器類型,缺省表示使用默認自增列值生成器。可以使用用戶自定義的列值生成器或選擇內置類型:SNOWFLAKE/UUID/LEAF_SEGMENT spring.shardingsphere.sharding.tables.<logic-table-name>.key-generator.props.<property-name>= #屬性配置, 注意:使用SNOWFLAKE算法,須要配置worker.id與max.tolerate.time.difference.milliseconds屬性。若使用此算法生成值做分片值,建議配置max.vibration.offset屬性 spring.shardingsphere.sharding.binding-tables[0]= #綁定表規則列表 spring.shardingsphere.sharding.broadcast-tables[0]= #廣播表規則列表 spring.shardingsphere.sharding.default-data-source-name= #未配置分片規則的表將經過默認數據源定位 spring.shardingsphere.sharding.default-database-strategy.xxx= #默認數據庫分片策略,同分庫策略 spring.shardingsphere.sharding.default-table-strategy.xxx= #默認表分片策略,同分表策略 spring.shardingsphere.sharding.default-key-generator.type= #默認自增列值生成器類型,缺省將使用org.apache.shardingsphere.core.keygen.generator.impl.SnowflakeKeyGenerator。可以使用用戶自定義的列值生成器或選擇內置類型:SNOWFLAKE/UUID/LEAF_SEGMENT spring.shardingsphere.sharding.default-key-generator.props.<property-name>= #自增列值生成器屬性配置, 好比SNOWFLAKE算法的worker.id與max.tolerate.time.difference.milliseconds spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.master-data-source-name= #詳見讀寫分離部分 spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.slave-data-source-names[0]= #詳見讀寫分離部分 spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.load-balance-algorithm-class-name= #詳見讀寫分離部分 spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.load-balance-algorithm-type= #詳見讀寫分離部分 spring.shardingsphere.props.sql.show= #是否開啓SQL顯示,默認值: false
分片實現原理
SQL解析 => 執行器優化 => SQL路由 => SQL改寫 => SQL執行 => 結果歸併git
ShardingDataSourceFactory用於建立分庫分表或分庫分表+讀寫分離的JDBC驅動
MasterSlaveDataSourceFactory用於建立獨立使用讀寫分離的JDBC驅動。
ShardingRuleConfiguration是分庫分表配置的核心和入口,它能夠包含多個TableRuleConfiguration和MasterSlaveRuleConfiguration。
每一組相同規則分片的表配置一個TableRuleConfiguration。若是須要分庫分表和讀寫分離共同使用,每個讀寫分離的邏輯庫配置一個MasterSlaveRuleConfiguration。
每一個TableRuleConfiguration對應一個ShardingStrategyConfiguration算法
分庫分表標準
這裏要說的是數據庫切分確實能夠解決數據庫的單點問題,可是它也會帶來總體服務切分後的數據庫操做的複雜度.spring
- 參考資料:
<p><a href="https://gitee.com/zzlh_liulei1/sharding-jdbc.git">demo碼雲地址</a></p>express