ShardingSphere广播表和绑定表

一、广播表

广播表:是指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。

适用于数据量不大且需要与海量数据的表进行关联查询的场景,这些表没必要做分片。

例如:例如字典表、省份信息等,因为他们数据量不大,而且这种表可能需要与海量数据的表进行关联查询。

注意:如果指定表为广播表,那个该表配置的分库分表策略是不会生效的,即广播表不会对数据分片。

CREATE TABLE `t_dict`  (
  `id` bigint(0) PRIMARY KEY NOT NULL,
  `status_code` varchar(100) NOT NULL,
  `status_value` varchar(100) NOT NULL,
	`enabled` tinyint(1) NOT NULL DEFAULT 1
);

1、application.properties 配置文件

在 application.properties 配置文件中进行

# 配置真实数据源
spring.shardingsphere.datasource.names=db1,db2
# 配置第1个数据源
spring.shardingsphere.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.db1.url=jdbc:mysql://localhost:3306/sharding_db1?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
spring.shardingsphere.datasource.db1.username=root
spring.shardingsphere.datasource.db1.password=123456
# 配置第2个数据源
spring.shardingsphere.datasource.db2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.db2.url=jdbc:mysql://localhost:3306/sharding_db2?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
spring.shardingsphere.datasource.db2.username=root
spring.shardingsphere.datasource.db2.password=123456


# 指定虚拟表与真实表的分布情况:分库,分表
## 广播表不会对数据进行分片,所以配置分库,分表规则是不会生效的
#spring.shardingsphere.sharding.tables.t_dict.actual-data-nodes=db$->{1..2}.t_dict_$->{1..2}
##广播表配置
spring.shardingsphere.sharding.broadcast-tables=t_dict
spring.shardingsphere.sharding.tables.t_dict.key-generator.column=id
spring.shardingsphere.sharding.tables.t_dict.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_dict.key-generator.props.worker.id=1

# 打开shardingsphere的sql日志输出。
spring.shardingsphere.props.sql.show=true

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true

2、保存测试

 @Test
    public void testSave() throws InterruptedException {
        Dict dict = new Dict();
        dict.setEnabled(true);
        dict.setStatusCode("1");
        dict.setStatusValue("正常");
        dictMapper.insert(dict);

        Dict dict2 = new Dict();
        dict.setEnabled(true);
        dict2.setStatusCode("2");
        dict2.setStatusValue("待认证");
        dictMapper.insert(dict2);
    }

在这里插入图片描述

二、绑定表

绑定表:是指分片规则一致的关系表(主表、子表)。

例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

CREATE TABLE t_order_1 (
	id BIGINT(20) PRIMARY KEY,
	gmt_create timestamp NULL DEFAULT NULL,
	name VARCHAR(50) NOT NULL,
	status varchar(10) NOT NULL
);
CREATE TABLE t_order_2 (
	id BIGINT(20) PRIMARY KEY,
	gmt_create timestamp NULL DEFAULT NULL,
	name VARCHAR(50) NOT NULL,
	status varchar(10) NOT NULL
);

CREATE TABLE t_order_item_1 (
	id BIGINT(20) PRIMARY KEY AUTO_INCREMENT,
	gmt_create timestamp NULL DEFAULT NULL,
	order_id BIGINT(20) NOT NULL,
	comment  varchar(100) NOT NULL
);
CREATE TABLE t_order_item_2 (
	id BIGINT(20) PRIMARY KEY AUTO_INCREMENT,
	gmt_create timestamp NULL DEFAULT NULL,
	order_id BIGINT(20) NOT NULL,
	comment  varchar(100) NOT NULL
);

在这里插入图片描述

1、application.properties 配置文件

在 application.properties 配置文件中进行

##2.绑定表配置:t_order和t_order_item表,均按照order_id分片
# 指定虚拟表与真实表的分布情况:t_order表
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=db$->{1..2}.t_order_$->{1..2}
# 指定表的主键生成策略,雪花算法
spring.shardingsphere.sharding.tables.t_order.key-generator.column=id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_order.key-generator.props.worker.id=1
##指定分片策略
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=db$->{id%2+1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{id%2+1}

# 指定虚拟表与真实表的分布情况:t_order_item表
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=db$->{1..2}.t_order_item_$->{1..2}
# 指定表的主键生成策略,雪花算法
spring.shardingsphere.sharding.tables.t_order_item.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order_item.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.t_order_item.key-generator.props.worker.id=1

##指定分片策略
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.algorithm-expression=db$->{order_id%2+1}
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id%2+1}

#绑定表配置
spring.shardingsphere.sharding.binding-tables[0]=t_order,t_order_item

2、测试

1)保存

@Test
	public void testSave() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			Order order = new Order();
			order.setGmtCreate(new Date());
			order.setName("java");
			order.setStatus("1");
			orderMapper.insert(order);
			System.out.println("OrderId ---->" + order.getId());

			OrderItem orderItem = new OrderItem();
			orderItem.setOrderId(order.getId());
			orderItem.setGmtCreate(new Date());
			orderItem.setComment("comment" + i);
			orderItemMapper.insert(orderItem);
		}

	}

2)关联查询

public interface OrderMapper extends BaseMapper<Order> {
    @Select("select o.id id, o.gmt_create gmt_create ,o.name name, o.status status, oi.comment comment\n" +
            "from t_order o left join t_order_item oi on o.id =oi.order_id")
    List<OrderDetailDTO> queryOrderDetail();

}
	@Test
	public void testGetById() {
		List<OrderDetailDTO> list = orderMapper.queryOrderDetail();
		System.out.println(list.size());
		 list.forEach(o -> System.out.println(o));
	} 

在这里插入图片描述

– 求知若饥,虚心若愚。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值