Sharding-jdbc的强大方便在于,在配置得当的情况下,代码层次无需任何的改动,与传统的编码格式一致,所以代码非常整洁干练。
SpringBoot引入Maven工程jar包依赖
<!-- https://mvnrepository.com/artifact/io.shardingsphere/sharding-jdbc-spring-boot-starter -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
Sharding-jdbc配置解读
// 注意:这里只是为了区分,真实的环境可在不同服务器,数据库名一致都是ds
sharding.jdbc.datasource.names=ds0,ds1
数据源ds0
sharding.jdbc.datasource.ds0.type=com.mysql.cj.jdbc.MysqlDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0
sharding.jdbc.datasource.ds0.user=root
sharding.jdbc.datasource.ds0.password=root
数据源ds1
sharding.jdbc.datasource.ds1.type=com.mysql.cj.jdbc.MysqlDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1
sharding.jdbc.datasource.ds1.user=root
sharding.jdbc.datasource.ds1.password=root
分库策略 注:分库ID不能与分表ID一样
// 操作哪个库 是由user_id因素来决策的
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id
// user_id % 2 决定了操作哪个库
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
分表策略
sharding.jdbc.config.sharding.tables.t_order.logic-table=t_order
// 操作哪张表 是由order_id因素来决策的
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
// order_id % 2 决定了操作哪张表
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2}
附加配置
// 绑定表(操作一张表数据同时,另一种绑定表也会添加数据) 绑定表可以理解为关联表,配置中可配置与哪个库中的那哪张表进行关联绑定。
sharding.jdbc.config.sharding.binding-tables=t_order,t_order_item
// 广播表(操作时 N个库 数据同步)
sharding.jdbc.config.sharding.broadcast-tables=city
Sharding-jdbc 数据源读写分离配置
sharding.jdbc.config.masterslave.name=dataSource
// 负载均衡器(默认:round-robin)
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round-robin
sharding.jdbc.config.masterslave.name
sharding.jdbc.config.masterslave.master-data-source-name=ds0
sharding.jdbc.config.masterslave.slave-data-source-names=ds1,ds2
分布式ID主键生成策略
// 如果自定义生成分布式ID,实现KeyGenerator接口,引入自定义类路径
sharding.jdbc.config.sharding.tables_t_order.key-generator-class-name=io.shardingsphere.core.keygen.DefaultKeyGenerator
sharding.jdbc.config.sharding.tables_t_order.key-generator-column-name=id
// 注:Sharding-jdbc默认的分布式ID生成策略是Twitter的snowflake(雪花算法)
DefaultKeyGenerator defaultKeyGenerator = new DefaultKeyGenerator();
defaultKeyGenerator.generatorKey();
Sharding-jdbc分布式事务
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-2pc-xa</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-spring</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>3.1.0</version>
</dependency>
目前市面上所用的还在持续更新的事务:atomikos
使用方式:需要添加的类上添加 @Transaction与@ShardingTransactionType(TransactionType.XA/LOCAL/BASE)
XA:多数据源分布式事务(缺陷:异常可以回滚但宕机或网络中断无法回滚)
LOCAL:单数据源本地事务(缺陷:异常数据不一致)
BASE:柔性事务 版本4.x才会完善更新有柔性事务
行表达式语法
- 范围型:${begin ...end}
- 枚举型:${[n1,n2,n3]}
例1: {1 ...3} 解析 user_table1 user_table2 user_table3 order_table1 order_table2 order_table3
例2: db0_user{0,1} 解析 db0_user0 db0_user2 db1_user0 db1_user2
网友评论