当前位置: 首页 > news >正文

SpringBoot整合Sharding-Jdbc实现分库分表和分布式全局id

SpringBoot整合Sharding-Jdbc

Sharding-Jdbc

sharding-jdbc是客户端代理的数据库中间件;它和MyCat最大的不同是sharding-jdbc支持库内分表。

整合

数据库环境

在两台不同的主机上分别都创建了sharding_order数据库,库中都有t_order_1和t_order_2两张表。
在这里插入图片描述

sharding-jdbc依赖如下

        <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>

application.properties配置文件

在application.properties配置文件中进行数据源配置、分库分表规则配置

#shardingsphere数据源配置
spring.shardingsphere.datasource.names=ds0,ds1#数据源配置
spring.shardingsphere.dataSource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.dataSource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.dataSource.ds0.jdbcUrl=jdbc:mysql://192.168.200.215:3306/sharding_order?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.dataSource.ds0.username=root
spring.shardingsphere.dataSource.ds0.password=rootspring.shardingsphere.dataSource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.dataSource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.dataSource.ds1.jdbcUrl=jdbc:mysql://192.168.200.225:3306/sharding_order?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.dataSource.ds1.username=root
spring.shardingsphere.dataSource.ds1.password=root#shardingsphere数据节点分片规则
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order_$->{1..2}#数据源分片规则,决定数据落在哪个库
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}#表分片规则,决定数据落在哪个表
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}#逻辑表,mybatis中查询的时候需要使用逻辑表查询,不能使用具体的分片表
spring.shardingsphere.sharding.tables.t_order.logic-table=t_order

测试

    /*** 测试分库分表*/@Testpublic void test4() {Order order = new Order();order.setId(5);order.setUserId(2);order.setOrderStatus(1);order.setOrderAmount(BigDecimal.valueOf(3000));orderMapper.insert(order);}

数据落在了215这台主机上的sharding_order数据库中的t_order_2表中;证明分库分表成功了。
在这里插入图片描述

分布式全局id设置

由于有两张order表,t_order_1和t_order2;而且在单表中我们往往会设置主键自增,那么就会出现表中的id重复的问题,sharding-jdbc支持使用通过雪花算法生成uuid作为主键来解决这个问题。

application.properties文件

#表分片规则
#标准表达式
spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.sharding-column=id
spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.precise-algorithm-class-name=com.sharding.jdbc.sharding.MySharding#id生成规则,分布式全局id
spring.shardingsphere.sharding.tables.t_order.key-generator.column=id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=UUID

分片规则

/*** @author DELL* @version 1.0* @description:精确分片规则* @date 2023/11/26 13:34:36*/
public class MySharding implements PreciseShardingAlgorithm<String> {/**** @param collection:表名* @param preciseShardingValue:生成的uuid、逻辑表、字段名* @return*/@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {String id = preciseShardingValue.getValue();int mode = id.hashCode() % collection.size();String[] strings = collection.toArray(new String[0]);System.out.println("strings:" + Arrays.toString(strings));return strings[Math.abs(mode)];}
}

测试生成分布式id

这里要注意的是由于这里的id是sharding-jdbc帮我们生成的,所以调用mapper中方法的时候不能指定id,否则不会自动生成。

    /*** 测试生成uuid*/@Testpublic void test5() {Order order = new Order();order.setUserId(3);order.setOrderStatus(1);order.setOrderAmount(BigDecimal.valueOf(3000));orderMapper.insert(order);}

如果报了这个错,大概率就是sql中指定了id。

Sharding value must implements Comparable.

uui的是有可能重复的,这里可以指定使用雪花算法生成uuid。雪花算法配置如下:

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=345

分片规则中的String需要改成Long。

参考

  1. Sharding-JDBC官网-配置手册
  2. ShardingSphere报Sharding value must implements Comparable.的解决过程

相关文章:

SpringBoot整合Sharding-Jdbc实现分库分表和分布式全局id

SpringBoot整合Sharding-Jdbc Sharding-Jdbc sharding-jdbc是客户端代理的数据库中间件&#xff1b;它和MyCat最大的不同是sharding-jdbc支持库内分表。 整合 数据库环境 在两台不同的主机上分别都创建了sharding_order数据库&#xff0c;库中都有t_order_1和t_order_2两张…...

「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web应用程序之间进行通信的协议&#xff0c;通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…...

vuex的使用笔记

1.安装 npm安装 npm install vuexnext --saveyarn安装 yarn add vuexnext --save2.基本结构 import Vuex from vuexconst store createStore({ //状态&#xff1a;相当于vue中的data&#xff08;&#xff09; state() {return {name: 0,code:"",todos: [{ id: 1…...

汇编:关于栈的知识

1.入栈和出栈指令 2. SS与SP 3. 入栈与出栈 3.1 执行push ax ↑↑ 3.2 执行pop ax ↓↓ 3.3 栈顶超界的问题 4. 寄存器赋值 基于8086CPU编程时&#xff0c;可以将一段内存当作栈来使用。一个栈段最大可以设为64KB&#xff08;0-FFFFH&#xff09;。 1.入栈和出栈指令…...

uniapp使用map标签

在UniApp中&#xff0c;可以使用map标签来显示地图&#xff0c;并通过其属性来自定义地图的样式和行为。以下是一些常用的map标签属性&#xff1a; id&#xff1a;用于给地图组件指定一个唯一的标识符&#xff0c;方便在代码中进行引用和操作。 style&#xff1a;用来设置地图…...

MacOS14 Sonoma 安装 Flutter 开发环境

本文针对 小白用户也包括自己&#xff0c;以前都是将这些写入我的有道云笔记。为了让给多人看见或者说自己更好的浏览&#xff0c;先将其记录如下。 朋友介绍一个项目说要开发一款App&#xff0c;最近也是闲着就答应下来。主要功能是通过蓝牙BLE控制设备的一个 Iot边缘设备&…...

【Web】PHP反序列化刷题记录

目录 ①[NISACTF 2022]babyserialize ②[NISACTF 2022]popchains ③[SWPUCTF 2022 新生赛]ez_ez_unserialize ④[GDOUCTF 2023]反方向的钟 再巩固下基础 ①[NISACTF 2022]babyserialize <?php include "waf.php"; class NISA{public $fun"show_me_fla…...

C++标准模板库 STL 简介(standard template library)

在 C 语言中&#xff0c;很多东西都是由我们自己去实现的&#xff0c;例如自定义数组&#xff0c;线程文件操作&#xff0c;排序算法等等&#xff0c;有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…...

Linux篇:文件系统

一、共识原理&#xff1a; 文件文件内容文件属性 磁盘上存储文件存文件的内容&#xff08;数据块&#xff09;存文件的属性&#xff08;inode&#xff09; Linux的文件在磁盘中存储是将属性和内容分开存储的。 二、硬件简述&#xff1a; 1. 认识硬件 磁盘&#xff1a;唯一的一…...

AI - Crowd Simulation(集群模拟)

类似鱼群&#xff0c;鸟群这种群体运动模拟。 是Microscopic Models 微观模型&#xff0c;定义每一个个体的行为&#xff0c;然后合在一起。 主要是根据一定范围内族群其他对象的运动状态决定自己的运动状态 Cohesion 保证个体不会脱离群体 求物体一定半径范围内的其他临近物…...

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…...

正则表达式 通配符 awk文本处理工具

目录 什么是正则表达式 概念 正则表达式的结构 正则表达式的组成 元字符 元字符点&#xff08;.&#xff09; 代表字符. 点值表示点需要转义 \ r..t 代表r到t之间任意两个字符 过滤出小写 过滤出非小写 space空格 [[:space:]] 表示次数 位置锚定 例&#xff1a…...

三、ts高级笔记,

文章目录 18、d.ts声明文件19、Mixin混入20、Decorator装饰器的使用21、-高级proxy拦截_Reflect元储存22、-高级写法Partial-Pick23、Readonly只读_Record套对象24、高阶写法Infer占位符25、Inter实现提取类型和倒叙递归26、object、Object、{}的区别27、localStorage封装28、协…...

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…...

flask依据现有的库表快速生成flask实体类

flask依据现有的库表快速生成flask实体类 在实际开发过程中&#xff0c;flask的sqlalchemy对应的model类写起来重复性较强&#xff0c;如果表比较多会比较繁琐&#xff0c;这个时候可以使用 flask-sqlacodegen 来快速的生成model程序或者py文件&#xff0c;以下是简单的示例&a…...

.NET6 开发一个检查某些状态持续多长时间的类

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在代码的世界里,时常碰撞…...

链表K个节点的组内逆序调整问题

链表K个节点的组内逆序调整问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;链表K个节点的组内逆序调整问题 CSDN&#xff1a;链表K个节点的组内逆序调整问题 题目描述 LeetCode 25. Reverse Nodes in k-Group 本题的 follow up 是&#xff1a; Fol…...

安卓隐私指示器学习笔记

最近了解到Google 在Android12上新增了权限指示器&#xff0c;可以在信号栏的右侧显示当前访问录音机和Camera的应用&#xff0c;点击后可以跳转到相应应用的权限界面&#xff0c;消费者可以控制权限的开启和关闭。国内手机厂商最近几年都在增加隐私看板供能&#xff0c;消费者…...

【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:

jenkins报错未能发送邮件到指定邮箱 注意&#xff1a;这是在系统配置中修改 在系统配置》邮件通知中添加配置信息 注意&#xff1a;这个是在项目的配置下修改 配置完成后&#xff0c;重新执行发送邮件成功&#xff01;&#xff01;&#xff01;...

CSS3制作3D爱心动画

1、什么是CSS css&#xff0c;即层叠样式表的简称&#xff0c;是一种标记语言&#xff0c;有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器&#xff0c;如下&#xff1a; 3、新样式 边框 css3新增了三个边框属性&#xff0c;分别是&#xff1a; bo…...

IndexTTS2 V23情感控制实测:如何用滑块调节喜怒哀乐语音

IndexTTS2 V23情感控制实测&#xff1a;如何用滑块调节喜怒哀乐语音 1. 情感语音合成技术概述 1.1 什么是情感语音合成 情感语音合成&#xff08;Emotional Text-to-Speech&#xff09;是语音合成技术的重要分支&#xff0c;它突破了传统TTS系统"机械感"的局限&am…...

ViGEmBus游戏控制器模拟驱动技术解析与应用指南

ViGEmBus游戏控制器模拟驱动技术解析与应用指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 游戏控制器模拟驱动是连接玩家与游戏世界的重要桥梁&#xf…...

Adrenaline终极指南:解锁PSP模拟器的完整潜力

Adrenaline终极指南&#xff1a;解锁PSP模拟器的完整潜力 【免费下载链接】Adrenaline Custom Firmware 6.61 Adrenaline for the PSP Emulator 项目地址: https://gitcode.com/gh_mirrors/adr/Adrenaline 你是否曾为PSP模拟器的功能限制而烦恼&#xff1f;想要在PS Vit…...

Rustup终极指南:轻松管理你的Rust开发环境

Rustup终极指南&#xff1a;轻松管理你的Rust开发环境 【免费下载链接】rustup The Rust toolchain installer 项目地址: https://gitcode.com/gh_mirrors/ru/rustup 你是否曾经为管理多个Rust版本而烦恼&#xff1f;或者在不同项目间切换工具链时感到困惑&#xff1f;R…...

告别纯CPU硬扛!手把手教你用树莓派5的VideoCore VII GPU加速NCNN+YOLOv8推理

解锁树莓派5的VideoCore VII潜能&#xff1a;NCNNYOLOv8 GPU加速实战指南 树莓派5的发布带来了令人振奋的性能提升&#xff0c;尤其是其VideoCore VII GPU的图形处理能力。对于计算机视觉开发者而言&#xff0c;这意味着我们终于可以在边缘设备上实现更高效的模型推理。本文将带…...

避坑指南:Cesium 多边形裁切(ClippingPolygon)性能优化与常见问题排查

Cesium多边形裁切性能优化实战&#xff1a;从纹理管理到着色器调优 当你在Cesium中加载一座数字城市的3DTiles模型时&#xff0c;多边形裁切功能就像一把精准的手术刀&#xff0c;能够剔除不需要展示的区域。但当你面对数百个动态更新的裁切多边形时&#xff0c;帧率骤降、内存…...

利用SoftEther实现跨平台虚拟私有网络部署指南

1. SoftEther简介与核心优势 如果你正在寻找一款能同时在Windows、Linux、Mac、Android和iOS上运行的虚拟私有网络解决方案&#xff0c;SoftEther绝对值得深入了解。这个源自日本筑波大学的开源项目&#xff0c;经过多年发展已经成为支持协议最全面的跨平台工具之一。我第一次…...

【Linux 物联网网关主控系统-Web部分(四)】

Linux 物联网网关主控系统-Web部分&#xff08;四&#xff09;调用关系总体框架main.htmltop.htmlleft.htmlright.htmlcgi部分调用关系 总体框架 main.html 调用的 HTML&#xff1a; top.html left.html right.html &#xff08;框架集页面&#xff0c;加载顶部、左侧、右侧三…...

3分钟掌握WindowResizer:告别Windows窗口尺寸烦恼的终极解决方案

3分钟掌握WindowResizer&#xff1a;告别Windows窗口尺寸烦恼的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows窗口尺寸问题而烦恼吗&#x…...

嵌入式系统的组成和模式深入分析

嵌入式系统的组成和模式深入分析 嵌入式系统是一个软硬件紧密结合的专用计算机系统。下面从组成结构和工作模式两个维度进行深入分析。 第一部分:嵌入式系统的组成结构 一、总体架构图 text ┌─────────────────────────────────────…...