
pexels-kauan-vargas-5829277.jpg
介紹:
Apache ShardingSphere 是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由 JDBC、Proxy 和 Sidecar(規(guī)劃中)這 3 款相互獨立的模塊組成。它們均提供標準化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫治理功能,可適用于如 Java 同構(gòu)、異構(gòu)語言、云原生等各種多樣化的應(yīng)用場景。
ShardingSphere-JDBC:定位為輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務(wù)。 它使用客戶端直連數(shù)據(jù)庫,以 jar 包形式提供服務(wù),無需額外部署和依賴,可理解為增強版的 JDBC 驅(qū)動,完全兼容 JDBC 和各種 ORM 框架。
- 適用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。
- 支持任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
- 支持任意實現(xiàn) JDBC 規(guī)范的數(shù)據(jù)庫,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 標準的數(shù)據(jù)庫。
功能架構(gòu)圖:

ShardingSphere-JDBC.png
步驟:
-
引入jar包:
jar.png -
mapper.xml:
使用邏輯庫和邏輯表名
mapper.png - 配置屬性
server.port=9095
mybatis.mapperLocations=classpath:mapper/*.xml
# 數(shù)據(jù)庫連接池配置變量
initialSize=5
minIdle=5
maxIdle=100
maxActive=20
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
####################################
# configuration of DataSource
####################################
sharding.jdbc.datasource.names=ds0,ds1
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=GMT%2B8&useSSL=false
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root
# 初始連接數(shù)
sharding.jdbc.datasource.ds0.initialSize=${initialSize}
# 最小連接數(shù)
sharding.jdbc.datasource.ds0.minIdle=${minIdle}
# 最大連接池數(shù)量
sharding.jdbc.datasource.ds0.maxActive=${maxActive}
# 配置獲取連接等待超時的時間
sharding.jdbc.datasource.ds0.maxWait=${maxWait}
# 用來檢測連接是否有效的sql
sharding.jdbc.datasource.ds0.validationQuery=SELECT 1 FROM DUAL
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
sharding.jdbc.datasource.ds0.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
# 配置一個連接在池中最小生存的時間,單位是毫秒
sharding.jdbc.datasource.ds0.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=GMT%2B8&useSSL=false
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=root
# 初始連接數(shù)
sharding.jdbc.datasource.ds1.initialSize=${initialSize}
# 最小連接數(shù)
sharding.jdbc.datasource.ds1.minIdle=${minIdle}
# 最大連接池數(shù)量
sharding.jdbc.datasource.ds1.maxActive=${maxActive}
# 配置獲取連接等待超時的時間
sharding.jdbc.datasource.ds1.maxWait=${maxWait}
# 用來檢測連接是否有效的sql
sharding.jdbc.datasource.ds1.validationQuery=SELECT 1 FROM DUAL
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
sharding.jdbc.datasource.ds1.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
# 配置一個連接在池中最小生存的時間,單位是毫秒
sharding.jdbc.datasource.ds1.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}
####################################
# 分庫分表配置
####################################
#actual-data-nodes:真實數(shù)據(jù)節(jié)點,由數(shù)據(jù)源名 + 表名組成,以小數(shù)點分隔。多個表以逗號分隔,支持inline表達式
sharding.jdbc.config.sharding.tables.t_user.actual-data-nodes=ds${0..1}.t_user_${0..1}
# 數(shù)據(jù)庫分片列名稱
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id
# 分庫算法表達式(取模 , HASH , 分塊等)
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds${user_id % 2}
# 分表字段
sharding.jdbc.config.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
# 分表策略,這里不能跟分庫策略一樣,否則會導(dǎo)致有一半數(shù)據(jù)表沒有機會插入數(shù)據(jù)
sharding.jdbc.config.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user_${(user_id % 5) % 2}
# 配置自動生成主鍵
sharding.jdbc.config.sharding.tables.t_user.key-generator-column-name=user_id
# 配置生成自增ID的雪花算法,單臺服務(wù)器可以不配置
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_user.key-generator.props.worker.id=1
spring.shardingsphere.sharding.tables.t_user.key-generator.props.max.tolerate.time.difference.milliseconds=0
spring.shardingsphere.props.sql.show=true
# open debug mode for mybatis,print SQL in console
logging.level.org.rockyang.shardingjdbc.common.mapper=DEBUG
logging.level.org.springframework=INFO
mybatis.configuration.cache-enabled=false
總結(jié):
上面這幾步,已經(jīng)可以測試、驗證ShardingSphere-JDBC的插入數(shù)據(jù)、路由的功能了。service和dao層的代碼,基本上不變。主要是引入對應(yīng)的jar包和配置很多分表、分庫的策略、主鍵生成策略...縱向、橫向。
代碼地址:https://github.com/easy0526lion/demo-shardingsphere.git

