ShardingSphere实战(4)- 广播表和默认数据源

news2025/1/11 14:22:31

上篇博客,我们讲了 ShardingSphere实战(3)- 快速实现分库分表 ,这篇博客,我们解决分库分表以后遗留的两个小问题。

一、广播表

1. 广播表介绍

广播表(Broadcast Table)是一种特殊的表类型,常见于分布式数据库系统中,如在Apache ShardingSphere等数据库中间件中被广泛应用。广播表的设计目的是为了处理那些数据量相对较小,但需要频繁参与跨分片查询或关联操作的表。

  • 广播表的特点:
    • 数据冗余:广播表在每一个数据分片(或数据库节点)中都有一个完整的副本,这意味着数据在每个节点上都是完全相同的。
    • 读取优化:由于每个节点都有完整数据,对于涉及广播表的查询可以直接在本地节点完成,无需进行跨节点通信,从而提高查询效率。
    • 更新控制:由于广播表的数据在所有节点上都需要保持一致,因此对广播表的更新操作需要被严格控制,以避免数据不一致的问题。
  • 使用场景:
    • 配置表:存储系统配置信息,如枚举值、状态码等,这类数据通常变化不大,但需要在查询时快速访问。
    • 字典表:存储一些固定的对照关系,如地区代码与名称的对照表。
    • 关联表:当一个表需要与多个分片的主表进行关联查询时,可以考虑使用广播表来减少跨分片的JOIN操作。

2. 广播表配置

基于上篇博客配置的前提下(上篇博客的最后放上了完整的配置,需要的可以去看看,这里就不重复写上去了),加上广播表的配置:

# 配置广播表
spring.shardingsphere.sharding.broadcast-tables=t_config

在这里插入图片描述

3. 测试

/**
     * 广播表测试-保存
     */
    @GetMapping("/test5")
    public String test5(@RequestParam("count") Integer count) {

        Date now = new Date();
        for (int i = 0; i < count; i++) {
            ConfigDO configDO = new ConfigDO();
            configDO.setId(this.getId());
            configDO.setRemark("remark" + i);
            configDO.setCreateTime(now);
            configDO.setLastModifyTime(now);
            configMapper.insertSelective(configDO);
        }
        return "success";
    }

运行结果:
在这里插入图片描述
ds-0.t_configds-1.t_config 表保存了相同的数据。

二、默认数据源

1. 为什么需要默认数据源

t_order 的数据量特比大,所以我们 分库分表
t_order_itemt_order 是关联关系,所以我们设置为 绑定表
t_config 数据量小,但是需要频繁参与跨分片查询或关联操作,所以我们设置为 广播表
但是有些表,它就是一张普通的表,不具备上面所说的属性,就希望像普通项目一样,正常增删改查,这时候指定默认数据源就派上用场了

2. 指定默认数据源配置

假如有部分表不需要分片配置,可以这样配置:

# 不需要分片的表配置
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds-0.t_user
spring.shardingsphere.sharding.tables.t_account.actual-data-nodes=ds-1.t_account

这样就可以指定 t_user 表路由到 ds-0 库中, t_account 表路由到 ds-1 库中。

如果其它未设置分片规则的表,都希望进入某一个默认库中,可以这样配置:

# 默认数据源配置
spring.shardingsphere.sharding.default-data-source-name=ds-0

三、完整配置

老规矩,下面是本篇博客关于ShardingSphere的完整配置:

# sharding-jdbc 水平分表策略
# 给数据源起别名,这里名称需要和下面的一致
spring.shardingsphere.datasource.names=ds-0,ds-1

# 配置数据源
spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://xxx:3316/ds-0?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-0.username=xxx
spring.shardingsphere.datasource.ds-0.password=xxx
spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://xxx:3316/ds-1?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-1.username=xxx
spring.shardingsphere.datasource.ds-1.password=xxx

####################### 配置分片表t_order #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds-$->{0..1}.t_order_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 3}


####################### 配置分片表t_order_item #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds-$->{0..1}.t_order_item_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 3}


# 绑定表关系
spring.shardingsphere.sharding.binding-tables=t_order,t_order_item
# 配置广播表
spring.shardingsphere.sharding.broadcast-tables=t_config

# 不需要分片的表配置
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds-0.t_user

# 默认数据源配置
spring.shardingsphere.sharding.default-data-source-name=ds-0

# 是否开启 SQL解析日志
spring.shardingsphere.props.sql.show=true

mybatis.mapper-locations=classpath:sqlmapper/*.xml

总结:本篇博客实现了广播表默认表路由,后续会陆续更新读写分离分布式事务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM学习10:整合MyBatis、MyBatisPlus

SpringBoot整合MyBatis 与创建spring web项目类型&#xff0c;添加上相应依赖 实体类 public class Account {private int id;public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String …

word打印---doc转html后进行打印,window.print、print-js、vue-print-nb

提示&#xff1a;word预览方式—插件 文章目录 [TOC](文章目录) 前言一、vue-office-docx把docx转换html二、调取window.print三、print-js四、vue-print-nb总结 前言 word预览 一、vue-office-docx把docx转换html npm install vue-office-docx -S-DofficeDocx.vue <templ…

Meta发布最新图形分割模型SAM 2:实时视频分割性能大幅提升

Meta发布最新图形分割模型SAM 2:实时视频分割性能大幅提升 在人工智能领域,图形分割是一项重要的技术,它能够识别和提取图像或视频中的目标对象。Meta近期发布的SAM 2(Segment Anything 2)模型在这一领域取得了重大突破。本文将详细介绍SAM 2的创新之处及其在视频对象实时…

vue3学习day02-组合式API-setup选项、reactive(将非响应式数据变为响应式数据)、computed(基本思想和vue2一致)、watch

6、setup选项 &#xff08;1&#xff09;setup选项的执行时机&#xff08;获取不到this&#xff0c;this是undefined&#xff09;&#xff1a;beforeCreate函数之前&#xff0c;自动执行 &#xff08;2&#xff09;写法 1&#xff09;原始写法 需要返回 ①在script中导出s…

【DeepSeek-V2 技术要点介绍】

DeepSeek-V2 是一款基于 Transformer 架构的先进模型&#xff0c;其中每个Transformer块由一个注意力模块和一个前馈网络&#xff08;FFN)组成。然而&#xff0c;对于注意力模块和 FFN&#xff0c;研究团队设计并采用了创新的架构。旨在通过创新的设计提升推理和训练效率。以下…

行为验证码的分类推荐

行为验证码 行为验证码是一种用于确认用户身份或验证用户行为的技术手段&#xff0c;通常用于防止自动化程序&#xff08;例如机器人&#xff09;对网站或应用程序进行恶意操作。它的核心思想是通过要求用户执行特定的交互动作来验证其为真实的人类 是一种通过用户的操作行为…

SDK 多版本管理控制利器 SDKMAN 介绍及使用

一、SDKMAN 假如你同时参与了一个使用JDK 8的项目和一个采用JDK 17特性的项目。每次在两个项目之间切换时&#xff0c;你都面临着版本冲突的问题。如果有那么一个工具类似于 Python 中的 anaconda 工具&#xff0c;可以帮助你管理不同版本的 SDK &#xff0c;是不是非常有用&a…

【32单片机篇】项目:LCD实时显示温湿度

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、硬件部分 四、项目源码及实现 1.项目源码 https://gitee.com/GeekerGao/upload-the-temperature-and-humidity-to-OneNET 2.项目实现

C语言 之 理解数组(8)数组和指针相关的题目 详细解答 快来观看

文章目录 1. 数组和指针相关题1.1 一维数组1.2 字符数组代码1代码2代码3代码4代码5代码6 1.3 二维数组 1. 数组和指针相关题 这里主要讲解的是通过sizeof和strlen来对数组和指针进行更深入的一些了解&#xff0c;建议有兴趣与初学者可以先尝试自己思考来完成。 1.1 一维数组 …

GPT-Pilot —— 让AI来写代码

1.概述 什么是GPT-Pilot&#xff1f; 一个AI开发者伴侣&#xff0c;可以从0开始构建应用程序&#xff0c;可以自己编写代码、配置开发环境、管理开发任务、调试代码。 项目地址&#xff1a;https://github.com/Pythagora-io/gpt-pilot 不仅仅是一个自动完成功能或 PR 消息的助…

CSP-J 2022 读程题16.答案与解析

知识点 普及 逻辑运算 16. 01 #include <iostream> 02 03 using namespace std; 04 05 int main() 06 { 07 unsigned short x, y; 08 cin >> x >> y; 09 x (x | x << 2) & 0x33; 10 x (x | x << 1) & 0x55; 11 y (y …

常见离线语音识别模块功能说明——天问ASR;机芯智能;海凌科;轻语音

本文章从开发方式及功能等方面上进行说明&#xff0c;便于开发者进行选择与开发。 本文章依据截至2024年8月1日各网站资料进行整理编写。 总结&#xff1a; 开发方式上&#xff1a; 天文ASR 有着最灵活的开发方式&#xff0c;可完全按照程序员意愿进行开发&#xff0c;同时有…

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z&#xff08;zombie&#xff09; 2、孤儿进…

[012-1].第12节:Mysql的配置文件的使用

6.配置文件的使用 6.1.配置文件的格式 1.查看配置文件&#xff1a;vim /etc/my.cnf 2.在配置文件中华定义了很多组&#xff0c;组名就分别是server&#xff0c;mysqld&#xff0c;mysqld_safe,client,mysql,mysqladmin&#xff0c;每个组下面就可以定制很多启动项&#xff1b…

scrapy框架2

scrapy框架2 一、中间件 &#xff08;下载中间件&#xff09; 利用中间件加cookie 案例&#xff1a;登录以后下载豆瓣的电影信息 def get_cookie_dict():cookie_str登陆后的cookiecookie_dict{}for item in cookie_str.split(";"):key,valueitem.split(""…

遇到缓存问题

问题&#xff1a;在事务中在进行数据库查询所有的数据后&#xff0c;将其中的数据更改几个后&#xff0c;重新进行查询。发现此时返回的数据并不是修改之后的数据。 经过学习后发现是Mybatis的一级缓存问题,同时也了解的Mybatis的二级缓存&#xff1a; Mybatis一级缓存: 当在…

SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持

背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互&#xff0c;因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此&#xff0c;大多数的应用开发时基本都是直接Http就过去了&#xff0c;不会一开始就是直接上Https。然而随着时间的推移&#xff0c…

WebGoC题解(16) 386.山洞

题目描述 小C和弟弟一起参观影视城&#xff0c;发现里面有m个圆形排列的“小山洞”&#xff0c;山洞用半径20、颜色号为编号的圆表示&#xff0c;由边长是100的线连接&#xff0c;均匀的发布一圈&#xff08;1号洞在正上方&#xff09;。m为8时如下图&#xff1a; 小C跟弟弟提议…

点赞10W+,销售额上百万,如何搭上奥运的流量快车?

2024巴黎奥运会正如火如荼进行中。一边是紧张的赛事与各种抓马事情&#xff0c;一边是法国的浪漫与中国00后的松弛&#xff0c;这届奥运会的看客仿佛瓜田里的猹&#xff0c;忙得不可开交。 作为全球范围内的重大体育盛事&#xff0c;奥运会一直以来都备受公众的热烈关注。 据腾…

Python PDF处理技巧 - 加密和解密PDF

目录 安装Python PDF库 使用Python加密PDF 使用Python设置PDF的安全权限 使用Python解密PDF PDF文档在我们的个人生活和工作中扮演着重要角色。从机密的商业报告到敏感的个人记录&#xff0c;PDF广泛应用于存储和共享重要信息。然而&#xff0c;随着数据泄露和未经授权访问…