公众号merlinsea
项目架构技术栈:springboot+mybatis plus+sharding jdbc
使用sharding jdbc的目的:按规则实现海量数据的水平分库分表功能。
准备工作:
本地创建两个数据库:xdclass_shop_order_0 和 xdclass_shop_order_1
在每个数据库中都创建两张数据表:product_order_0 和 product_order_1
1、在项目的pom.xml文件中引入sharding jdbc的依赖,其他的mybatis plus,数据库连接池的依赖也需要自己引入,【这里只展示sharding jdbc的依赖,其他的自己引入即可】
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency>
2、在创建每张表的DO对象时TableName用的是逻辑表名
@Data @TableName("product_order") //product_order是逻辑表名 @EqualsAndHashCode(callSuper = false) public class ProductOrderDO { @TableId(value = "id",type = IdType.AUTO) private Long id; private String outTradeNo; private String state; private Date createTime; private Double payAmount; private String nickname; private Long userId; }
3、配置文件 application.properties
核心点:
1、配置多个数据源,这里是ds0和ds1 【ds,data source】
2、为每个数据源绑定一个具体的数据库
3、具体指定每个真实节点,每个节点是对应数据库的一张具体的表
4、指定分片键和分片算法
spring.application.name=xdclass-sharding-jdbc server.port=8080 # 打印执行的数据库以及语句 spring.shardingsphere.props.sql.show=true # 数据源。可以配置多个数据源 spring.shardingsphere.datasource.names=ds0,ds1 # 第一个数据源ds0对应的数据库xdclass_shop_order_0 spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/xdclass_shop_order_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password=linxxyy # 第二个数据源ds1对应的数据库xdclass_shop_order_1 spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/xdclass_shop_order_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=linxxyy # 指定product_order表的数据分布情况,配置数据真实节点,行表达式标识符使用 ${...} 或 $->{...}, # 但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...} spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1} # 指定product_order表的分片策略,分片策略包括【分片键和分片算法】 spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=user_id spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{user_id % 2}
4、测试代码
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class) @Slf4j public class DbTest { @Autowired private ProductOrderMapper productOrderMapper; @Test public void testSaveProductOrder(){ for(int i=0; i<10;i++){ ProductOrderDO productOrderDO = new ProductOrderDO(); productOrderDO.setCreateTime(new Date()); productOrderDO.setNickname("小滴课堂i="+i); productOrderDO.setOutTradeNo(UUID.randomUUID().toString().substring(0,32)); productOrderDO.setPayAmount(100.00); productOrderDO.setState("PAY"); productOrderDO.setUserId(Long.valueOf(i+"")); productOrderMapper.insert(productOrderDO); } } }
测试结果
1、按照user_id将数据插入到了不同的表中
2、可以发现不同的表中数据的id是有重复的,即出现了ID冲突的问题
sharding jdbc的实现机理
下面介绍一下我们的算法训练营,目前算法已经整理到了50多题了,如果大家对算法刷题有困难的可以找我帮忙,我带你手把手刷题。
我后期还会推出数据结构java版本,下面我给出我的目录大纲,大概今年九月份到十月份推出~