2. Sharding-JDBC广播表和绑定表操作
1. 广播表实战
⼴播表概念
1. 指所有的分⽚数据源中都存在的表,表结构和表中的数据在每个数据库中均完全⼀致。
2. 适⽤于数据量不⼤且需要与海量数据的表进⾏关联查询的场景。
3. 例如:字典表、配置表。
注意
1. 分库分表中间件,对应的数据库字段,不能是sql的关键字
在2个库中分别进行表创建
CREATE TABLE `ad_config` (`id` bigint unsigned NOT NULL COMMENT '主键id',`config_key` varchar(1024) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配置key',`config_value` varchar(1024) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配置value',`type` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '类型',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin;
实体类
package com.dss.sharding.model;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ad_config")
public class AdConfigDO {private Long id;private String configKey;private String configValue;private String type;}
package com.dss.sharding.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dss.sharding.model.AdConfigDO;public interface AdConfigMapper extends BaseMapper<AdConfigDO> {
}
新增配置项
#配置广播表
spring.shardingsphere.sharding.broadcast-tables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE
测试
@Autowired
private AdConfigMapper adConfigMapper;@Testpublic void testSaveAdConfig(){AdConfigDO adConfigDO = new AdConfigDO();adConfigDO.setConfigKey("banner");adConfigDO.setConfigValue("csdn.net");adConfigDO.setType("adss");adConfigMapper.insert(adConfigDO);}
结论
广播表中的数据是完全一模一样的
2 ⽔平分库+⽔平分表配置
库表结构
1. 2个数据库、每个库2张表
需求
1. 插⼊订单数据,分布在不同的库和表上
操作
1. 参考第一章,建立两个库,两个库中各有2张订单表
分库分表配置
1. 分库规则 根据 user_id 进⾏分库
2. 分表规则 根据 product_order_id 订单号进⾏分表
完整的配置文件
spring.application.name=dss-sharding-jdbc
server.port=8080# 打印执行的数据库以及语句
spring.shardingsphere.props.sql.show=true# 数据源 db0
spring.shardingsphere.datasource.names=ds0,ds1# 第一个数据库
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://127.0.0.1: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=root# 第二个数据库
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://127.0.0.1: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=root#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1#配置广播表
spring.shardingsphere.sharding.broadcast-tables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE#配置分库规则
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 }#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=ds0.product_order_$->{0..1}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}# 指定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}
测试类
@Testpublic void testSaveProductOrder2(){Random random = new Random();for(int i=0; i<20;i++){ProductOrderDO productOrderDO = new ProductOrderDO();productOrderDO.setCreateTime(new Date());productOrderDO.setNickname("dss_i="+i);productOrderDO.setOutTradeNo(UUID.randomUUID().toString().substring(0,32));productOrderDO.setPayAmount(100.00);productOrderDO.setState("PAY");/*** userid需要实时生成*/productOrderDO.setUserId( Long.valueOf(random.nextInt(50)) );productOrderMapper.insert(productOrderDO);}}
测试效果
1. 共计20条数据,分别落在2各库中的2各表中。
2. 4张表的数据量分别是6,6,6,2条