Sharding-JDBC快速使用【笔记】

1 引言

      最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求,参考官方文档(Sharding官方文档)感觉内容庞杂不够有条理,重复内容比较多;现结合项目应用整理笔记如下供大家参考和自己回忆使用;
      在实现基于分布式数据库的应用系统ShardingShpere系列产品还是相当不错和成熟的,本文重点讲述其第一款产品Sharding-JDBC的快速使用。
      ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。

1.1 Sharding-JDBC介绍

      Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。 它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
在这里插入图片描述

1.2 Sharding-JDBC特点

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

      Sharding-JDBC的优势在于对Java应用的友好度。

2 快速使用

      这里重点讲述数据分片、读写分离

2.1 数据分片

      传统的应用将数据集中存储至单一数据节点的解决方案,在性能、可用性和运维成本这三方面已经难以应对数据海量的场景,所以数据分片的概念就适时提出。
      数据分片指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果。数据分片的有效手段是对关系型数据库进行分库和分表。分库和分表均可以有效的避免由数据量超过可承受阈值而产生的查询瓶颈。除此之外,分库还能够用于有效的分散对数据库单点的访问量;分表虽然无法缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能,一旦涉及到跨库的更新操作,分布式事务往往会使问题变得复杂。使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性。

2.1.1 分片算法

      通过分片算法将数据分片,支持通过=、>=、<=、>、<、between和in分片。分片算法需要应用开发者自行实现,可实现的灵活度非常高,目前提供4种分片算法。

  • PreciseShardingAlgorithm:精确分片算法,用于处理使用单一键作为分片键的=或in进行分片的场景。需要配合StandardShardingStrategy使用;
  • RangeShardingAlgorithm:范围分片算法,用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景。需要配合StandardShardingStrategy使用;
  • ComplexKeysShardingAlgorithm:复合分片算法,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy使用;
  • HintShardingAlgorithm:Hint分片算法,用于处理使用Hint行分片的场景。需要配合HintShardingStrategy使用。

2.1.2 分片策略

      分片策略=分片键+分片算法。目前提供5种分片策略。

  • StandardShardingStrategy:标准分片策略,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND, >, <, >=, <=分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。
  • ComplexShardingStrategy:复合分片策略,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
  • InlineShardingStrategy:行表达式分片策略,使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。
  • HintShardingStrategy:Hint分片策略,通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略。
  • NoneShardingStrategy:不分片策略,不分片的策略。

2.1.3 数据分片例子

      这里将列举一个单表含多个分片键的列表查询示例,这里使用Yaml的方式进行分片配置,其他方式请读者参考官方文档;

分片配置
spring:shardingsphere:datasource:names: ds0ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/db1?characterEncoding=utf8username: rootpassword: 123456sharding:default-database-strategy:inline:sharding-column: idalgorithm-expression: ds$->{0}tables:t_order:actual-data-nodes: ds$->{0}.artb_area_receivable_$->{0..10}_$->{2010..2024}databaseStrategy:standard:shardingColumn: idpreciseAlgorithmClassName: org.jeecg.common.DBShardingAlgorithmtableStrategy:complex:shardingColumns: tenant_code,yearalgorithmClassName: org.jeecg.common.TableComplexKeysShardingAlgorithmkeyGenerator:column: idtype: SNOWFLAKEprops:worker:id: 123props:sql:show: true
分片算法
/*** @author 一朝风月* @date 2024-01-02 10:50*/
@Slf4j
public class TableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm<String> {@Overridepublic Collection<String> doSharding(Collection collection, ComplexKeysShardingValue complexKeysShardingValue) {HashMap<String, ArrayList<String>> map = (HashMap<String, ArrayList<String>>) complexKeysShardingValue.getColumnNameAndShardingValuesMap();String tenantCode= map.get("tenant_code").get(0);String year = map.get("year").get(0);collection.clear();collection.add(complexKeysShardingValue.getLogicTableName() + "_" + tenantCode+ "_" + year);return collection;}
}
测试结果
2024-01-03 15:36:16.847 [http-nio-7006-exec-1] INFO  ShardingSphere-SQL:74 - Actual SQL: ds0 ::: SELECT id,tenant_code,year,order_name,archive FROM t_order_7_2023 AND WHERE  year=? AND tenant_code=? AND archive=false LIMIT ? ::: [2023, 7, 10]

2.2 读写分离

      将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,这种拆分称之为读写分离,它能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

Yaml配置
spring:shardingsphere:dataSources:ds_master: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_masterusername: rootpassword: ds_slave0: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_slave0username: rootpassword: ds_slave1: !!org.apache.commons.dbcp.BasicDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ds_slave1username: rootpassword: masterSlaveRule:name: ds_msmasterDataSourceName: ds_masterslaveDataSourceNames: - ds_slave0- ds_slave1props:sql.show: true

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

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

相关文章

为什么要太空探索?未来万亿人口 人类移居太空是不可避免的。大语言模型是发现 贝索斯

管理的思考 「最以客户为中心」「果断」「如何决策」 贝索斯给亚马逊的使命是「世上最以客户为中心的公司」(以客户需求为起点&#xff0c;反向推动工作)。贝索斯给蓝色起源的使命是「世上最果断的公司」(我们将变得非常擅长在技术上恰当地冒险&#xff0c;并快速地作出那些决…

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParame…

钉钉-蓝牙打卡和平台打卡的区别

钉钉的群是部门概念。 你的账号归属到哪个群&#xff0c;就是哪个群的员工。 -------------------------------------------------------------------- 蓝牙打卡是对账号归属进行打卡的。 平台打卡是只对属于自己平台内的账号打卡的。 ----------------------------------…

【MATLAB】PSO粒子群优化BiLSTM(PSO_BiLSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于PSO粒子群优化的BiLSTM的时间序列预测算法的基本原理如下&#xff1a; 「双向长短时记忆&#xff08;BiLSTM&#xff09;模型」&#xff1a;这是一种深度学习模型&#xff0c;特别适用…

感恩客户相伴23载,泛微2024持续向上!

2023年&#xff0c;国家大力推动数字经济发展&#xff0c;各行各业在加速数字化转型&#xff0c;在这一年&#xff0c;泛微保持持续增长&#xff0c;引领行业发展&#xff0c;为组织的数字化转型助力。感恩客户与伙伴朋友的支持与信任&#xff01; 01.泛微中大客户总量突破8万余…

Unity中Shader的Reversed-Z(DirectX平台)

文章目录 前言一、在对裁剪坐标归一化设置NDC时&#xff0c;DirectX平台Z的特殊二、在图形计算器中&#xff0c;看一下Z值反转前后变化1、在图形计算器创建两个变量 n 和 f 分别 控制近裁剪面 和 远裁剪面2、带入公式得到齐次裁剪空间下Z值3、进行透视除法4、用 1 - Z 得出Z值反…

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性&#xff0c;来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

维生素B5和琥珀酰辅酶A可以改善SF3B1基因突变引起无效造血过程

今天给同学们分享一篇实验文章“Vitamin B5 and succinyl-CoA improve ineffective erythropoiesis in SF3B1-mutated myelodysplasia”&#xff0c;这篇文章发表在Sci Transl Med期刊上&#xff0c;影响因子为17.1。 结果解读&#xff1a; SF3B1突变导致MDS-RS患者COASY异构体…

短视频账号矩阵系统源码/技术交付3年开发源头

账号矩阵3年技术独立开发打造是一个非常有挑战性和前景的项目。以下是一些建议&#xff0c;帮助你成功打造一个成功的短视频账号矩阵&#xff1a; 1. 确定目标受众&#xff1a;首先需要明确你的目标受众是谁&#xff0c;了解他们的兴趣爱好、年龄、性别等&#xff0c;以便为他们…

八大算法排序@选择排序(C语言版本)

目录 选择排序概念算法思想示例步骤1步骤2步骤...n最后一步 代码实现时间复杂度空间复杂度特性总结 选择排序 概念 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。基本思想是在未排序的序列中找到最小&#xff08;或最大&#xff09;元素&#xf…

RS485数据采集模块,如何一次采集多个modbus设备数据?

在工业数据采集中&#xff0c;RS485是一种常见的数据通信协议&#xff0c;而Modbus则是其上的常用设备协议。那么&#xff0c;如何用一个模块高效采集多个Modbus设备的数据呢&#xff1f;这就是我们今天要探讨的话题&#xff01; 什么是RS485数据采集模块&#xff1f; 首先&a…

ALSA学习(5)——设备中的alsa

参考博客&#xff1a; https://blog.csdn.net/DroidPhone/article/details/7165482 &#xff08;一下内容基本是原博主的博客转载&#xff09; 文章目录 一、ASOC的由来二、硬件架构三、软件架构四、数据结构五、内核对ASoC的改进 一、ASOC的由来 ASoC–ALSA System on Chip …

CMake入门教程【基础篇】在Windows、Linux上安装CMake

文章目录 1.windows平台第1步&#xff1a;下载CMake第2步&#xff1a;安装CMake第3步&#xff1a;验证安装第4步&#xff1a;初次使用第5步&#xff1a;构建和运行 2.Linux平台2.1 使用包管理器安装2.2 使用预编译的二进制文件2.3 从源代码编译2.4注意事项 1.windows平台 第1步…

数据库中二进制数据图片的读取并存储为文件C++

插入二进制数据https://blog.csdn.net/wjl990316fddwjl/article/details/135334950我们需要将插入的数据进行读取&#xff0c;本文主要介绍如何C如何将数据库中二进制数据图片进行读取和存储 1、查询数据 sql"select * from t_data"; 2、获得查询结果 MYSQL_RES …

IF;10.0+,中科院1区TOP,Elsevier出版社,发文量大!毕业首选!

【SciencePub学术】本期&#xff0c;小编给大家推荐的是一本Elsevier旗下、工程技术领域、影响因子为10.0的中科院1区TOP。其详情如下&#xff1a; 期刊简介 ENERGY CONVERSION AND MANAGEMENT ISSN&#xff1a;0196-8904 E-ISSN&#xff1a;1879-2227 IF&#xff08;2…

软件测试行业最核心的竞争力是什么?

在当今数字化时代&#xff0c;软件测试行业已成为科技领域不可或缺的一环。软件测试人员扮演着保障产品质量和用户满意度的重要角色。然而&#xff0c;随着行业的竞争日益激烈&#xff0c;如何保持竞争力成为软件测试人员必须思考的问题。 为了弄清楚这个问题&#xff0c;我和…

数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)

目录 一、概述 二、原理 三、搭建 1、备份数据 2、主库配置Ubuntu22.04 2.1、设置阿里云服务器安全组 2.2、修改配置文件 /etc/my.cnf 2.3、重启MySQL服务 2.4、登录mysql&#xff0c;创建远程连接的账号&#xff0c;并授予主从复制权限 2.5、通过指令&#xff0c;查…

mysql 条件位运算实现多值存储

一、多值存储 mysql 条件位运算位运算实现多值存储&#xff0c;方法适合数据范围有限&#xff0c;且不会变更在业务上往往会出现多选的情况&#xff0c;例&#xff1a;选择 周一 至 周日 随意组合&#xff1b; 数据在设计时就会如何去储存&#xff1f; 一种是一般是在储存是以…

阶段五-JavaWeb综合练习-学生管理系统

一.项目说明 1.前台 (用户使用) 前端,后端 2.后台 (管理员使用) 前端,后端 3.该项目为后台管理系统 项目开发流程: 1.需求分析 1.1 登录功能 用户访问登录页面输入用户名和密码,并且输入验证码。全部输入正确后点击登录&#xff0c;登录成功跳转主页面&#xff1b;登录…