Springboot使用sharedingjdbc實現(xiàn)分庫分表
一、簡介
Apache ShardingSphere 是一套開源的分布式數(shù)據(jù)庫解決方案組成的生態(tài)圈,它由 JDBC、Proxy 和 Sidecar(規(guī)劃中)這 3 款既能夠獨立部署,又支持混合部署配合使用的產(chǎn)品組成。 它們均提供標準化的數(shù)據(jù)水平擴展、分布式事務(wù)和分布式治理等功能,可適用于如 Java 同構(gòu)、異構(gòu)語言、云原生等各種多樣化的應(yīng)用場景。
Apache ShardingSphere 5.x 版本開始致力于可插拔架構(gòu),項目的功能組件能夠靈活的以可插拔的方式進行擴展。
目前,數(shù)據(jù)分片、讀寫分離、數(shù)據(jù)加密、影子庫壓測等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 與協(xié)議的支持,均通過插件的方式織入項目。
開發(fā)者能夠像使用積木一樣定制屬于自己的獨特系統(tǒng)。Apache ShardingSphere 目前已提供數(shù)十個 SPI 作為系統(tǒng)的擴展點,仍在不斷增加中。
- 官網(wǎng):http://shardingsphere.apache.org/index_zh.html
- 下載地址:https://shardingsphere.apache.org/document/current/cn/downloads/
- 快速入門:https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/
二、使用注意事項
- 使用版本問題,不同版本之間存在差異較大(參數(shù)),請參考官方文檔,切記不可隨意百度
- update 時,不可對分片字段進行更新(分片字段必須在規(guī)則上保持固定)
- 5.1.0版本使用shardingsphere-jdbc-core-spring-boot-starter時,并且使用druid時,需要加dbcp依賴
- 時間字段作為分片字段時,需要使用date類型,不可使用localDataTime 或者localDate類型
- 數(shù)據(jù)分片后主鍵自增問題,需要使用分布式主策略,例如利用redis自增主鍵,雪花算法,UUID等
- 分頁查詢跨表較大時候,shareding會進行表的union 操作,可能會造成數(shù)據(jù)瓶頸(業(yè)務(wù)上做處理)
- 不支持自動建表,自動分片功能需自行編碼
- 部分復(fù)雜查詢不支持,請參考官網(wǎng):https://shardingsphere.apache.org/document/5.1.0/cn/user-manual/shardingsphere-jdbc/unsupported/
三、項目使用
添加pom依賴
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
</dependency>
<!-- ShardingJDBC 5.1.0使用druid連接池需要加dbcp依賴 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
</dependency>
yml配置信息
spring:
### 處理連接池沖突 #####
main:
allow-bean-definition-overriding: true
shardingsphere:
# 是否啟用 Sharding
enabled: false
# 打印sql
props:
sql-show: false
datasource:
names: ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://123.57.164.186:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: root
# password: JoygisIot@2023
url: jdbc:mysql://123.57.23.160:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: root
password: JoygisIot@2023
# 數(shù)據(jù)源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true,
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
#filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
rules:
sharding:
# 表策略配置
tables:
# t_user 是邏輯表
b_compaction_data:
# 配置數(shù)據(jù)節(jié)點,這里是按月分表
# 示例1:時間范圍設(shè)置在202201 ~ 210012
# actualDataNodes: mydb.t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2}
# 示例2:時間范圍設(shè)置在202201 ~ 202203
#actualDataNodes: ds${0..1}.tmp_order_item
actualDataNodes: ds0.b_compaction_data
tableStrategy:
complex:
sharding-columns: gps_time,sn
algorithm-class-name:
shardingAlgorithmName: time-sn-sharding-altorithm
keyGenerateStrategy:
column: id
keyGeneratorName: compaction-data-id
# 分片算法配置
keyGenerators:
compaction-data-id:
type: 'INCREMENT'
shardingAlgorithms:
time-sn-sharding-altorithm:
# 類型:自定義策略
type: CLASS_BASED
props:
# 分片策略
strategy: complex
# 分片算法類
algorithmClassName: com.joygis.sharding.algorithm.ComplexTimeAndSnShardingAlgorithm
代碼配置
- a. 自定義數(shù)據(jù)源

說明:shardingSphereDataSource 為默認數(shù)據(jù)源,如需修改配置信息,可重新定義 重新注入即可
- b. 使用動態(tài)數(shù)據(jù)源

說明: 查詢接口中,直接標記數(shù)據(jù)類型即可,如為mabatisplus 請使用@Ds注解
自定義主鍵策略


說明:shareding中用了大量的java spi 加載機制進行代碼解耦,包括主鍵生成策略,spi機制此處不做介紹請自行百度,此處使用的為redis自增主鍵(查詢中例如id比較),保證id 全局唯一,type類型必須與yml文件中保持一致
單字段分表策略
說明: 類型指定為Standard ,實現(xiàn)StandardShardingAlgorithm類即可,項目中因要求不同,此處代碼完成但為使用,需要實現(xiàn)兩個doshared方法,PreciseShardingValue 為精確匹配 例如 in、= 等方式,RangeShardingValue為范圍匹配 例如 between,< ,> 等
單字段分表策略
說明: 如上述yml 所示配置,實現(xiàn)ComplexKeysShardingAlgorithm接口即可,僅一個接口ComplexKeysShardingValue 中存在兩個屬性,分別為范圍屬性及精確指定屬性
自動創(chuàng)建表
說明: 判斷表是否存在(例如本地緩存,提升速度),如果存在則不創(chuàng)建表,如果不存在,則直接創(chuàng)建表,創(chuàng)建完成后需要更新shareding 配置信息,詳細代碼 請查看ShardingAlgorithmTool.tableNameCacheReloadAll();類
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA8獲取list集合中重復(fù)的元素與獲取去重數(shù)據(jù)實例
這篇文章主要給大家介紹了關(guān)于JAVA8獲取list集合中重復(fù)的元素與獲取去重數(shù)據(jù)的相關(guān)資料,在實際開發(fā)中經(jīng)常會遇到需要找出(刪除)一個list中某些元素的屬性相同的元素,需要的朋友可以參考下2023-07-07
InputStreamReader和BufferedReader用法及實例講解
這篇文章主要介紹了InputStreamReader和BufferedReader用法及實例講解的相關(guān)資料,需要的朋友可以參考下2015-12-12
Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法
這篇文章主要介紹了Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
SpringBoot工程下Lombok的應(yīng)用教程詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot工程下Lombok應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

