SpringBoot中使用Sharding-JDBC实战(实战+版本兼容+Bug解决)

一、实战

1、引入 ShardingSphere-JDBC 的依赖

https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc/5.5.0

<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.0</version><exclusions><exclusion><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-test-util</artifactId></exclusion></exclusions>
</dependency>

下面是我项目的一些版本信息:

SpringBoot 3.2.4

shardingsphere 5.5.0

2、修改yaml配置文件

application.yaml:
spring:profiles:active: devmain:allow-circular-references: truedatasource:# ShardingSphere 对 Driver 自定义,实现分库分表等隐藏逻辑driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver# ShardingSphere 配置文件路径url: jdbc:shardingsphere:classpath:shardingsphere-config.yaml
#    driver-class-name: ${quick.datasource.driver-class-name}
#    url: jdbc:mysql://${quick.datasource.host}:${quick.datasource.port}/${quick.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
#    username: ${quick.datasource.username}
#    password: ${quick.datasource.password}
#    hikari:
#      maximum-pool-size: 50

shardingsphere-config.yaml

名字必须相同,前面的 jdbc:shardingsphere:classpath: 是固定写法。

大致的配置结构如上。

dataSources:ds_0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://127.0.0.1:3306/quick_pickup?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=trueusername: rootpassword: 123456# 规则配置
rules:- !SINGLEtables:# 加载全部单表- "ds_0.*"- !SHARDINGtables:integral_package_order:actualDataNodes: ds_0.integral_package_order_${0..15}  # 配置数据表分片规则tableStrategy:standard:shardingColumn: user_id  # 使用 user_id 作为分片键shardingAlgorithmName: integral_package_order_table_hash_mod  # 使用自定义的分片算法shardingAlgorithms:integral_package_order_table_hash_mod:
#        type: HASH_MOD  # 使用 HASH_MOD 算法
#        props:
#          sharding-count: 16  # 设置分片数量为 16type: INLINEprops:algorithm-expression: integral_package_order_${user_id % 16}props:sql-show: true  # 控制台打印 SQL 日志,便于调试# 单机模式 也有集群模式 此处本机选择单机即可 这个必须添加! 不然要报错
mode:type: Standalone

其中注意必须加上:

就是两点可能错误:

1.xxx表无法加载

Caused by: org.apache.ibatis.executor.ExecutorException: Error preparing statement. Cause: org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException: Table or view 'store' does not exist. at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:99) ~[mybatis-3.5.14.jar:3.5.14] at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.14.jar:3.5.14]

2.不能使用自动的算法这类型的报错

Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Sharding algorithm HASH_MOD initialization failed, reason is: integral_package_order tables sharding configuration can not use auto sharding algorithm.. at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) ~[HikariCP-5.0.1.jar:na]

上面截图中HashMod的分片数量里面这个integral_package_order_${order_id % 16}属性应该是16才对,但是还是报错,有大佬有解决可以评论区教教。

设置好需要分片的表,下面就是对表进行水平分片

3、对表进行水平分片

这里我写了一个测试案例可以帮忙我生成16个建表语句:

package com.quick.sharding;public class IntegralPackageOrderShardingTest {// 基础 SQL 模板,使用占位符 `%d` 替换分表的后缀public static final String SQL_TEMPLATE = "create table integral_package_order_%d\n" +"(\n" +"    id                  bigint                              not null comment '主键'\n" +"        primary key,\n" +"    user_id             bigint unsigned                     not null comment '抢购积分包的用户id',\n" +"    integral_package_id bigint unsigned                     not null comment '抢购的积分包id',\n" +"    create_time         timestamp default CURRENT_TIMESTAMP not null comment '抢购时间',\n" +"    has_use             int                                 null comment '是否使用(0未使用 1已使用)'\n" +")\n" +"    comment '积分包订单' charset = utf8mb4\n" +"                         row_format = COMPACT;\n" +"\n" +"create index idx_userId_integral_package_order_%d\n" +"    on integral_package_order_%d (user_id);\n";public static void main(String[] args) {// 生成 16 个分表 SQLfor (int i = 0; i < 16; i++) {// 替换占位符并打印结果String sql = String.format(SQL_TEMPLATE, i, i, i);System.out.println(sql);}}
}

 输出如下:

如何运行这些sql即可:

分表完成后理论上是全部配置完成了,但是你会发现运行了没报错,但是发现接口测试,发现了会出现后面的一些问题,这里我先给出解决的配置,就是在你的 WebMvcConfiguration 中加上下面那一段配置。

/*** 参考:<a href="https://hafuhafu.com/archives/springboot-jackson-xml-result-json/">...</a>* 设置默认的内容类型,并禁用检查Accept请求头,服务端就会忽视原有请求的Accept中的内容协商类型,而按照配置的默认的类型进行响应。* 按以下配置的情况下,请求默认总是返回JSON。* 如果想让部分接口只返回XML格式的数据,可以在@RequestMapping中配置produces,* 如@GetMapping(value = "/api/users",produces = MediaType.APPLICATION_XHTML_XML_VALUE),那个接口就会返回XML格式的数据。* @param configurer 配置器*/@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_XHTML_XML).ignoreAcceptHeader(true);}

4、解决问题

这里只是讲述第三点最后部分解决问题的一些方案,如果不想深入了解可以直接看测试分表那边。

傻眼了,为什么是xml格式,也就是下面这类型的问题:

Spring 5 -jackson-dataformat-xml forces @ResponseBody with XML

结果是XML格式,而不是我们希望的Json格式,我们之前配置的Json序列化失效了吗,这个是我当时的怀疑,其实这个也还是好解决的,只困扰了我一小会,如何去搜,下面先给出解决办法。

我在 WebMvcConfiguration 加了这个一个配置,然后运行解决了

成功输出了Json格式的返回。

下面是我去Github搜的一个解决方案:

shardingsphere-jdbc-5.5.0 causes spring boot to return JSON data as XML · Issue #31203 · apache/shardingsphere · GitHub

这个大佬遇到的问题和我的一样,下面就有很多好友有做评论区解决,大概都聚集在5.5.0版本的shardingsphere让WebMVC的Json转换器失效,因为他自带了一个jackson-dataformat-xml这个东西

这个大佬有提到移除那个依赖,我下面试了这样子做:

结果却报了另外的错误。。。可能是我没完全理解意思,还有另外的策略。

最后我采用了这个策略,再加一个配置

阅读了那个大佬多年工作经验的解决办法,成功加了一个配置解决了那个问题,但是在我的项目里面就多了两个Json序列化,有点在shi山上又多加了几行的感觉。。。

但是还是解决了,但是发现接口文档出现下面这个问题

我们主打的就是一个遇到问题解决问题,再次改造,上面的问题可能是优先级比接口文档高导致接口文档失效,这里就不调整优先级,换了另外一个解决方案,如果不使用接口文档那样子还是可以的。

将上面的配置换成:

/*** 参考:<a href="https://hafuhafu.com/archives/springboot-jackson-xml-result-json/">...</a>* 设置默认的内容类型,并禁用检查Accept请求头,服务端就会忽视原有请求的Accept中的内容协商类型,而按照配置的默认的类型进行响应。* 按以下配置的情况下,请求默认总是返回JSON。* 如果想让部分接口只返回XML格式的数据,可以在@RequestMapping中配置produces,* 如@GetMapping(value = "/api/users",produces = MediaType.APPLICATION_XHTML_XML_VALUE),那个接口就会返回XML格式的数据。* @param configurer 配置器*/@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.APPLICATION_XHTML_XML).ignoreAcceptHeader(true);}

参考了这个文档:内容协商:SpringBoot添加jackson-xml后浏览器返回值的变化 – 败犬不需要安可

mark一下大佬的解决方案。

5、测试分表

这里从测试结合我之前做过的这些博客食用更佳:

对自己关于秒杀功能的一次访谈与实战-CSDN博客

基于之前的秒杀功能的优化(包括Sentinel在SpringBoot中的简单应用)-CSDN博客

1.添加积分包

这里已经是可以看到ShardingSphere生效了。

2.查询所有积分包

3.启用禁用积分包

redis中如下:

可以看到库存已经存在,为100.

4.用户查看所有秒杀积分包信息

5.根据积分包id查询库存

6.用户秒杀抢购积分包

在数据库中可以看出已经存在一条数据了

redis中库存也-1

订单信息也存在

7.用户查看自己的积分包订单

8.禁用积分包

9.删除积分包

删除成功

10.压测

由于上诉是连接服务器的数据库进行测试,下面用本地数据库进行压测

jmeter配置:

开始压测:

如下可见,已经分别分布在各个表上,分表成功:

二、还有一些遇到过的bug

之前用的是下面这个依赖,遇到各种形形色色的问题,可能是版本不服的问题吧,如果有大佬知道怎么解决可以评论区说说,还有上面为什么不能使用HashMod这个算法的原因......

<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc-core -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.3.2</version>
</dependency>

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

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

相关文章

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

PyQT开发与实践:全面掌握跨平台桌面应用开发

目录 引言 PyQT简介 PyQT的主要特点 开发环境搭建 PyQT开发流程 1. 创建项目和主窗口 2. 添加控件和布局 3. 信号与槽 4. 样式和美化 高级特性 数据绑定和模型/视图编程 多线程和并发 国际化和本地化 实践案例&#xff1a;简单的计算器应用 1. 界面设计 2. 逻辑…

微信小程序条件渲染与列表渲染的全面教程

微信小程序条件渲染与列表渲染的全面教程 引言 在微信小程序的开发中,条件渲染和列表渲染是构建动态用户界面的重要技术。通过条件渲染,我们可以根据不同的状态展示不同的内容,而列表渲染则使得我们能够高效地展示一组数据。本文将详细讲解这两种渲染方式的用法,结合实例…

Origin教程003:数据导入(2)-从文件导入和导入矩阵数据

文章目录 3.3 从文件导入3.3.1 导入txt文件3.3.2 导入excel文件3.3.3 合并工作表3.4 导入矩阵数据3.3 从文件导入 所需数据 https://download.csdn.net/download/WwLK123/900267473.3.1 导入txt文件 选择【数据->从文件导入->导入向导】: 选择文件之后,点击完成即可…

刷题计划 day22回溯(一)【组合】【组合总和 III】【电话号码的字母组合】

⚡刷题计划day22 回溯&#xff08;一&#xff09;开始&#xff0c;此期开启回溯专题&#xff0c;敬请期待关注&#xff0c;可以点个免费的赞哦~ 往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录 回溯算法理论基础 回溯法解决的…

访问限定符

文章目录 一、访问限定符 一、访问限定符 C⼀种实现封装的⽅式&#xff0c;用类将对象的属性与方法结合在⼀块&#xff0c;让对象更加完善&#xff0c;通过访问权限选择性的将其接口提供给外部的用户使用。 public修饰的成员在类外可以直接被访问&#xff1b;protected和priva…

【论文阅读】WGSR

0. 摘要 0.1. 问题提出 1.超分辨率(SR)是一个不适定逆问题&#xff0c;可行解众多。 2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。 3.现有的方法重建高频细节时会产生伪影和幻觉&#xff0c;模型区分图像细节与伪影仍是难题。 0.2. …

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

Kylin Server V10 下基于Sentinel(哨兵)实现Redis高可用集群

一、什么是哨兵模式 Redis Sentinel 是一个分布式系统,为 Redis 提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress)这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线信息,并使用投票协议(agreement protocols)来决定是否执行…

扩散模型从原理到实战 入门

diffusion-models-class-CN/unit1/README_CN.md at main darcula1993/diffusion-models-class-CN GitHub 你可以使用命令行来通过此令牌登录 (huggingface-cli login) 或者运行以下单元来登录&#xff1a; from huggingface_hub import notebook_loginnotebook_login() http…

阅读《先进引信技术的发展与展望》识别和控制部分_笔记

基本信息 题名&#xff1a;先进引信技术的发展与展望 作者&#xff1a; 张合;戴可人 发表时间&#xff1a;2023-07-20 可装定、可探测、可处理、可控制是灵巧引信设计的四项基本能力。与之对应&#xff0c;先进引信的基础研究涵盖了信息交联技术、末端探测技术、目标识别技术…

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程&#xff0c;通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom&#xff0c;根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据&#xff0c;可以使用通义千问&#xff0c;关于LinearScale与BandScale不懂的地方也可以在通义千…

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu&#xff08;安装下载不再赘述&#xff09; sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&#xff0c;…

SMMU软件指南操作之流(stream)安全性和流标识

安全之安全(security)博客目录导读 目录 1、流安全性 2、流标识 2.1 什么是 StreamID? 2.2 SubstreamID 的作用 1、流安全性 SMMUv3 架构在没有实现 RME 设备分配的情况下,支持两种可选的安全状态,这由 SMMU_S_IDR1.SECURE_IMPL 报告。如果实现了 RME 设备分配,则通过…

Android仿前端分页组件pagination

仿前端pagination Android仿前端分页组件pagination 最近Android原生有个需求就是做个分页组件&#xff0c;不用上拉加载&#xff0c;因为数据量太大用户喜欢前端的方式&#xff0c;UI主要是拼凑比较简单&#xff0c;主要补充了一些判断越界和数据不全的细节&#xff0c;记录方…

贴代码框架PasteForm特性介绍之query,linkquery

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

深入理解下oracle 11g block组成

深层次说&#xff0c;oracle数据库的最少组成单位应该是块&#xff0c;一般默认情况下&#xff0c;oracle数据库的块大小是8kb&#xff0c;其中存储着我们平常所需的数据。我们在使用过程中&#xff0c;难免会疑问道&#xff1a;“oracle数据块中到底是怎样组成的&#xff0c;平…

万有引力定律和库仑定律:自然的对称诗篇

万有引力定律和库仑定律&#xff1a;自然的对称诗篇 在宇宙深邃的知识长河中&#xff0c;万有引力定律和库仑定律恰似两颗璀璨的明珠&#xff0c;闪耀着人类智慧与自然奥秘的光辉。 十七世纪&#xff0c;牛顿在对天体运行的深邃思索中&#xff0c;拨开重重迷雾&#xff0c;发现…