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
相关文章:
Sharding-JDBC快速使用【笔记】
1 引言 最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求,参考官方文档(Sharding官方文档)感觉内容庞杂不够有条理,重复内容比较多;现结合项目应用整理笔记如下供大家参考和自己回忆使用; 在…...
总结MySQL 的一些知识点:MySQL 排序
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Linux中经常使用的相关命令
查看硬盘存储容量使用情况: df -lh 列出 /bin 目录中的 5 个最大文件: ls -lSh /bin | head -5 删除文件和文件夹 在Linux中,要删除文件的命令是rm。你可以使用以下命令来删除一个文件: rm file_name如果要删除多个文件,可…...
2022-2023年度广东省职业院校学生专业技能大赛“软件测试”赛项性能测试题目-Jmeter
性能测试-JM 1、脚本添加: 脚本文件名称:SuppAndComp,测试计划名称:SuppAndComp。测试计划下添加两个线程组: (1)线程组一操作内容:系统管理员登录、进行新增供应商操作。 线程组名称SuppAdd。具体要求如下: 登录操作存放到仅一次控制器中,供应商名称前4位为固定…...
R304S 指纹识别模块的硬件接口说明
一.外部接口尺寸图 二.串行通讯 R304S 指纹模块通讯接口定义: 引脚号名称定义描述15V电源输入电源正输入端 DC 4.2--6V2GND电源和信号地电源和信号地3TXD数据发送串行数据输出,TTL 逻辑电平4RXD数据接收串行数据输入,TTL 逻辑电平 三.USB通…...
postman使用-05新建测试集
文章目录 两种方式新建测试集测试集:允许用户以项目或模块的方式对多个接口进行分类和管理。每一个测试请求都可以被看作是一个独立的测试用例,而collections则可以同时管理多个测试用例的执行。方法一:点击左上角直接创建测试方法二…...
oracle 子查询和窗口函数
描述:给定一张学生学科成绩表base_student_grade,字段id表示学生学号,name为姓名,subject表示学科,grade为某学科成绩。使用子查询和窗口函数查询每个学生成绩最高的学科和分数。 select id,name,subject,grade from (select id,…...
数据库开发与设计过程中的问题分析总结
数据库设计的过程是将数据库系统与现实世界密切地、有机地、协调一致地结合起来的过程。数据库的设计质量与设计者的知识、经验和水平密切相关。作为数据库应用系统的重要组成部分,数据库设计的成败往往直接关系到整个应用系统的成败。以数据库为基础的数据库应用系…...
《数据库开发实践》之存储过程【知识点罗列+例题演练】
一、什么是存储过程? 1.概念理解: 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句,提供一种封装任务的方法。因此在创建编译好某个存储过程后,因为存储过程中有可执行操作的sql语句,用户可以…...
Linux进程地址空间
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:HEART BEAT—YOASOBI 2:20━━━━━━️💟──────── 5:35 🔄 ◀️ ⏸ ▶️ ☰ …...
2024.1.3 关于 Redis 渐进式遍历 和 数据库管理命令
目录 引言 渐进式遍历 SCAN 命令 数据库管理命令 切换数据库 获取数据库 key 个数 删除数据库所有 key 同步删除 SYNC 异步删除 ASYNC 阅读下述文章之前建议点击下方链接熟悉 keys 命令的用法和特点 Redis 全局通用命令 渐进式遍历 keys * 命令一次性将 Redi…...
并发编程:线程同步基础:5、读写锁。ReentrantReadWriteLock
1、主要方法 .readLock().lock();获取读锁 读锁之间互不干扰。 .writeLock().lock();获取写锁 写锁可以锁定住读锁和其他写操作。 2、主程序 package xyz.jangle.thread.test.n2_5.rwlock;import java.util.concurrent.TimeUnit;/*** * 读写锁。ReentrantReadWriteLock* a…...
SpringBoot 集成 Kafka消息中间件,Docker安装Kafka环境
前述 提供kafka、zooker在docker环境下进行安装的示例,springBoot集成kafka实现producer-生产者和consumer-消费者(监听消费:single模式和batch模式)的功能实现 环境安装 # 拉取镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka# 运行zooker docker …...
阿里云Alibaba Cloud Linux 3镜像版本大全特性说明
Alibaba Cloud Linux阿里云打造的Linux服务器操作系统发行版,Alibaba Cloud Linux完全兼容完全兼容CentOS/RHEL生态和操作方式,目前已经推出Alibaba Cloud Linux 3,阿里云百科aliyunbaike.com分享Alibaba Cloud Linux 3版本特性说明ÿ…...
基于SSM的滁艺咖啡在线销售系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则
文章目录 一. 如何判断类的职责是否足够单一?二. 类的职责是否设计得越单一越好? 开始学习一些经典的设计原则,其中包括,SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义:…...
MYSQL 深入探索系列六 SQL执行计划
概述 好久不见了,近期一直在忙项目的事,才有时间写博客,近期频繁出现sql问题,今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警,有个6千万的日志表,查询耗时大…...
安装jupyter notebook,jupyter notebook的简单使用
借助anaconda安装jupyter notebook,先下载anaconda然后在Anaconda Prompt中输入命令: 输入"jupyter notebook",在默认浏览器中打开jupyter notebook。 输入"jupyter notebook --no-browser",启动服务器,但不打…...
宏集PC Runtime软件助推食品行业生产线数字化革新
一、前言 近年来,中国食品行业发展迅速且灵活多变,在当前经济下行的情形下,食品行业正面临着日益激烈的竞争,导致企业利润下降。 为了保持企业市场竞争力,国内某top10食品企业采用宏集SCADA解决方案—PC Runtime软件…...
python的课后练习总结3之条件语句
1,简单点,只有IF IF 后面加入条件然后冒号: 条件成立执行的代码1 条件成立执行的代码2 条件是否成立都执行的代码 身高 float(input(请输入你的身高(米):)) if 身高 > 1.3:print(f您的身高是{身高}米,请您买票) print(祝您旅途愉快) 2,IF 加个else if 条件:…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
