Springboot,使用sharedingjdbc 分库分表,最佳实践。

一、简介

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。

官网:http://shardingsphere.apache.org/index_zh.html
下载地址:https://shardingsphere.apache.org/document/current/cn/downloads/
快速入门:https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/

二、使用注意事项

  1. 使用版本问题,不同版本之间存在差异较大(参数),请参考官方文档,切记不可随意百度
  2. update 时,不可对分片字段进行更新(分片字段必须在规则上保持固定)
  3. 5.1.0版本使用shardingsphere-jdbc-core-spring-boot-starter时,并且使用druid时,需要加dbcp依赖
  4. 时间字段作为分片字段时,需要使用date类型,不可使用localDataTime 或者localDate类型
  5. 数据分片后主键自增问题,需要使用分布式主策略,例如利用redis自增主键,雪花算法,UUID等
  6. 分页查询跨表较大时候,shareding会进行表的union 操作,可能会造成数据瓶颈(业务上做处理)
  7. 不支持自动建表,自动分片功能需自行编码
  8. 部分复杂查询不支持,请参考官网:https://shardingsphere.apache.org/document/5.1.0/cn/user-manual/shardingsphere-jdbc/unsupported/

三、项目使用

* 添加pom依赖
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
</dependency>
<!-- ShardingJDBC 5.1.0使用druid连接池需要加dbcp依赖 -->
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-dbcp</artifactId>
</dependency>
* yml配置信息
spring:### 处理连接池冲突 #####main:allow-bean-definition-overriding: trueshardingsphere:# 是否启用 Shardingenabled: false# 打印sqlprops:sql-show: falsedatasource:names: ds0ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver
#                url: jdbc:mysql://123.57.164.186:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#                username: root
#                password: JoygisIot@2023url: jdbc:mysql://123.57.23.160:13306/digital_constr?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: JoygisIot@2023# 数据源其他配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: true,testOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙#filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500rules:sharding:# 表策略配置tables:# t_user 是逻辑表b_compaction_data:# 配置数据节点,这里是按月分表# 示例1:时间范围设置在202201 ~ 210012# actualDataNodes: mydb.t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2}# 示例2:时间范围设置在202201 ~ 202203#actualDataNodes: ds${0..1}.tmp_order_itemactualDataNodes: ds0.b_compaction_datatableStrategy:complex:sharding-columns: gps_time,snalgorithm-class-name:shardingAlgorithmName: time-sn-sharding-altorithmkeyGenerateStrategy:column: idkeyGeneratorName: compaction-data-id# 分片算法配置keyGenerators:compaction-data-id:type: 'INCREMENT'shardingAlgorithms:time-sn-sharding-altorithm:# 类型:自定义策略type: CLASS_BASEDprops:# 分片策略strategy: complex# 分片算法类algorithmClassName: com.joygis.sharding.algorithm.ComplexTimeAndSnShardingAlgorithm
* 代码配置
a. 自定义数据源

image.png

说明:shardingSphereDataSource 为默认数据源,如需修改配置信息,可重新定义 重新注入即可

b. 使用动态数据源

image.png

说明: 查询接口中,直接标记数据类型即可,如为mabatisplus 请使用@Ds注解

* 自定义主键策略

image.png

image.png

说明:shareding中用了大量的java spi 加载机制进行代码解耦,包括主键生成策略,spi机制此处不做介绍请自行百度,此处使用的为redis自增主键(查询中例如id比较),保证id 全局唯一,type类型必须与yml文件中保持一致

* 单字段分表策略

说明: 类型指定为Standard ,实现StandardShardingAlgorithm类即可,项目中因要求不同,此处代码完成但为使用,需要实现两个doshared方法,PreciseShardingValue 为精确匹配 例如 in、= 等方式,RangeShardingValue为范围匹配 例如 between,< ,> 等

* 单字段分表策略

说明: 如上述yml 所示配置,实现ComplexKeysShardingAlgorithm接口即可,仅一个接口ComplexKeysShardingValue 中存在两个属性,分别为范围属性及精确指定属性

* 自动创建表

说明: 判断表是否存在(例如本地缓存,提升速度),如果存在则不创建表,如果不存在,则直接创建表,创建完成后需要更新shareding 配置信息,详细代码 请查看ShardingAlgorithmTool.tableNameCacheReloadAll();类

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

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

相关文章

我在代码随想录|写代码Day17之二叉树-222.完全二叉树的节点个数,110.平衡二叉树,257. 二叉树的所有路径

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)…

数学建模绘图

注意&#xff1a;本文章旨在记录观看B站UP数模加油站之后的笔记文章&#xff0c;无任何商业用途~~ 必备网站 以下网站我都试过&#xff0c;可以正常访问 配色&#xff08;取色&#xff09;网站&#xff1a; Color Palettes Generator and Color Gradient Tool Python&#x…

Pandas ------ 通过 np.array 函数去掉数据中的 index

Pandas ------ 通过 np.array 函数去掉数据中的 index 引言正文 引言 在做 pandas 数据处理的时候遇到了一个问题&#xff0c;获取到的数据总是会带有 dateframe 的格式&#xff0c;即总会有 index 显示出来。为了去掉这些显示&#xff0c;我们可以使用 np.array() 函数进行数…

python Django入门

1.创建Django项目 方式一:进入到指定要存放项目的目录&#xff0c;执行*django-admin startproject “projectname”* 来创建一个名方式二:使用Pycharm专业版创建Django项目 创建项目后&#xff0c;默认的目录结构: manage.py:是Django用于管理本项目的命令行工具&#xff0c…

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 子组件 可…

KG110写频 AT28C64芯片替换

上一个文章写了写频计算公式 https://blog.csdn.net/firseve/article/details/135743549 没想到就几天好多人给点赞&#xff0c;这个中继现在还有很多人在使用么&#xff1f;谁能给解个惑 今天搜了下这个中继设备&#xff0c;默认原机器使用的芯片是 2716 2732 &#xff08;2…

php怎么输入一个变量,http常用的两种请求方式getpost(ctf基础)

php是网页脚本语言&#xff0c;网页一般支持两种提交变量的方式&#xff0c;即get和post get方式传参 直接在网页URL的后面写上【?a1027】&#xff0c;如果有多个参数则用&符号连接&#xff0c; 如【?a10&b27】 post方式传参 需要借助插件&#xff0c;ctfer必备插…

自学C语言-6

第6章 选择结构程序设计 顺序结构程序设计最简单&#xff0c;但通常无法解决生活中的选择性问题。选择结构程序设计需要用到一些条件判断语句&#xff0c;可实现的程序功能更加复杂&#xff0c;程序的逻辑性与灵活性也更加强大。 本章致力于使读者掌握使用if语句进行条件判断的…

OpenHarmony开发——GN快速上手

背景 最近在研究鸿蒙操作系统的开源项目OpenHarmony&#xff0c;该项目使用了GNNinja工具链进行配置&#xff0c;编译&#xff0c;于是开始研究GN如何使用。 本文的所有信息均来自GN官网和本人个人体会。 GN快速入门 使用GN GN的主要功能是根据配置文件&#xff08;.gn, BU…

交换机跨VLAN交换数据ip跳转分析(不一定对)

在网上看到这样一个实验&#xff1a; 交换机1、交换机2分别连接到一台防火墙上&#xff0c;要求使VLAN 2、VLAN3、VLAN5、VLAN6中的终端可互相访问。 拓补 参考链接 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理_网管型交的机…

DC60V降压恒流 3A电流 直播美颜补光灯专用降压IC

DC60V降压恒流3A电流直播美颜补光灯专用降压IC 随着直播行业的兴起&#xff0c;美颜补光灯成为了直播中不可或缺的设备之一。然而&#xff0c;不同的直播设备和场景需要不同的灯光效果&#xff0c;因此需要一款能够提供稳定、高质量照明的补光灯。其中&#xff0c;DC60V降压恒流…

CentOS7自动备份数据库到git

虽然数据库没什么数据&#xff0c;但是有就是珍贵的啦&#xff0c;为了服务器什么的无了&#xff0c;所以还是要自动备份一下比较好。 Open备忘第一页 步骤 在Gitee&#xff08;github&#xff09;上创建一个私有仓库Gitee&#xff08;github&#xff09;配置好服务器的ssh在服…

论文阅读:Vary-toy论文阅读笔记

目录 引言整体结构图方法介绍训练vision vocabulary阶段PDF数据目标检测数据 训练Vary-toy阶段Vary-toy结构数据集情况 引言 论文&#xff1a;Small Language Model Meets with Reinforced Vision Vocabulary Paper | Github | Demo 说来也巧&#xff0c;之前在写论文阅读&…

微信小程序开发如何实现圆形按钮/圆角按钮

圆形按钮&#xff1a; 显示&#xff1a; 实现 .wxml <view style"width: 100%;height:200rpx;display: flex; align-items: center;justify-content: center;"><view style"width:20px; height:20px; border-radius: 50%; background-color: red; t…

134. 加油站 - 力扣(LeetCode)

题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和…

SHA加密在实际应用中的优势与局限

SHA加密算法简介 SHA&#xff08;Secure Hash Algorithm&#xff09;加密算法是一种单向加密算法&#xff0c;常用于加密数据的完整性校验和加密签名。它是由美国国家安全局&#xff08;NSA&#xff09;设计并广泛应用于各种安全场景。SHA加密算法具有较高的安全性和可靠性&…

线性代数速通

二---矩阵 逆矩阵 抽象矩阵求逆 数字型矩阵求逆 二阶矩阵求逆秒杀 解矩阵方程 方阵 伴随矩阵 三---向量组的线性相关性 线性表示 数字型向量组 线性相关性判断 抽象型向量组 线性相关性判断 向量组的秩与极大无关组 四---线性方程组 齐次方程组 基础解系 通解 非齐…

定制工厂实时数据采集系统 优秀智能制造信息系统服务

工业数据采集是指通过传感器、仪表等设备将工业生产过程中的各种数据进行采集和记录,以便进行数据分析、监控和优化。但现状却是引入的各自动化设备、仪器等各自为政&#xff0c;或者进显示检测数据&#xff0c;难以实现数据连通&#xff0c;难以统一处理&#xff0c;定制的数据…

并查集与图

并查集与图 一、并查集概念实现原理代码实现查找根节点合并两颗树判断是否是同一棵树树的数量 二、图的基本概念定义分类完全图顶点的度连通图 三、图的存储结构分类邻接表邻接表的结构代码实现 邻接矩阵代码实现 四、图的遍历方式广度优先深度优先 五、最小生成树概念Kruskal算…

网络原理-初识(2)

协议分层 对于网络协议来说,往往分成几个层次进行定义. 网络通信的过程中,需要涉及到的细节,其实非常多.如果要有一个协议来完成网络通信,就需要约定好方方面面的内容,导致非常复杂. 而如果拆分的话,就十分复杂,庞大,因此需要分层. 什么是协议分层 即只有相邻的层次可以沟通,…