公众号merlinsea
- 需求
1、按照user_id来进行分库
如果user_id%2==0 则插入ds0库中
如果user_id%2==1 则插入ds1库中
2、按照id进行分表
如果id%2==0,则插入product_order_0表中
如果id%2==1,则插入product_order_1表中
修改application.properties配置文件如下【重点】
核心点:
指定分库规则:包含分库的键,以及对应的规则
指定分表规则:包含分表的键,已经对应的规则
将分库分表组合起来作为真实的节点
spring.application.name=project-sharding-jdbc server.port=8080 # 打印执行的数据库以及语句 spring.shardingsphere.props.sql.show=true # 指定多个数据源 spring.shardingsphere.datasource.names=ds0,ds1 # 第一个数据源ds0绑定数据库 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=mysqlxxyy # 第二个数据源ds1绑定数据库 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=mysqlxxyy #配置workId spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1 #配置数据的分库规则 # 指定【product_order商品表】中数据的分库策略,分库策略包括【分片键和分片算法】 spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.sharding-column=user_id spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2 } # 配置分表规则 # 指定【product_order商品表】中数据的分表策略,分表策略包括【分片键和分片算法】 spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2} #id生成策略,解决分表以后的id重复问题 spring.shardingsphere.sharding.tables.product_order.key-generator.column=id spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE # 指定product_order表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...}, # 但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...} spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}
测试代码
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class) @Slf4j public class DbTest { @Autowired private ProductOrderMapper productOrderMapper; @Autowired private AdConfigMapper adConfigMapper; @Test public void testSaveProductOrder(){ Random random = new Random(); for(int i=0; i<20;i++){ ProductOrderDO productOrderDO = new ProductOrderDO(); productOrderDO.setCreateTime(new Date()); productOrderDO.setNickname("lianglin "+i); productOrderDO.setOutTradeNo(UUID.randomUUID().toString().substring(0,32)); productOrderDO.setPayAmount(100.00); productOrderDO.setState("PAY"); productOrderDO.setUserId( Long.valueOf(random.nextInt(50)) ); productOrderMapper.insert(productOrderDO); } } @Test public void testSelectProductOrder(){ List<Long> list = List.of(1481434463010320386L,1481434459961061377L,1481434462959988738L,1481434462976765953L); List<ProductOrderDO> productOrderDOList = productOrderMapper.selectBatchIds(list); System.out.println(productOrderDOList); //ProductOrderDO productOrderDO = productOrderMapper.selectOne(new QueryWrapper<ProductOrderDO>() // .eq("id",1481434462959988738L).eq("user_id",6)); // System.out.println(productOrderDO); } }
下面介绍一下我们的算法训练营,目前算法已经整理到了50多题了,如果大家对算法刷题有困难的可以找我帮忙,我带你手把手刷题。
我后期还会推出数据结构java版本,下面我给出我的目录大纲,大概今年九月份到十月份推出~