深入探索Sharding JDBC:分库分表的利器
随着互联网应用的不断发展和用户量的不断增加,传统的数据库在应对高并发和大数据量的场景下面临着巨大的挑战。为了解决这一问题,分库分表成为了一个非常流行的方案。分库分表主流的技术包括MyCat和Sharding JDBC。我们来通过一张图来了解这两者有什么区别:

从上图可以看到,MyCat是一个单独的中间件,读者朋友们可以把它理解为一个数据库(不过它不是数据库哦,只是对于应用端来说连接使用MyCat和数据库是一样的,对应用程序来说,不需要关心具体是数据库还是MyCat;而Sharding JDBC则是整合到应用端的,它运行在应用端,和代码的耦合性相对MyCat来说要更高)。本文笔者将深入探索Sharding JDBC,介绍其核心概念、工作原理以及使用方法,并通过一个示例帮助读者更好地理解和应用Sharding JDBC。
1. 什么是Sharding JDBC?
Sharding JDBC是一款基于Java的开源中间件,用于简化分库分表的操作和管理。它提供了一套统一的接口和封装,屏蔽了底层数据库的细节,让开发者可以像使用单一数据库一样操作分布式数据库。
2. Sharding JDBC的核心概念
2.1 数据库切片(Sharding)
数据库切片是指将一个大型数据库按照某种规则拆分成多个较小的数据库实例,每个数据库实例称为一个切片。切片可以根据不同的规则进行拆分,如按照用户ID、地域等进行划分。
2.2 分布式表(Sharding Table)
分布式表是指将一个表按照某种规则拆分成多个子表,每个子表存储了相同表结构的不同数据。通常,分布式表的拆分规则与数据库切片的规则相一致。
2.3 数据库路由(Database Sharding)
数据库路由是指根据某种规则将数据库的操作路由到对应的数据库切片上。Sharding JDBC提供了路由策略的配置,可以根据业务需求进行灵活的配置。
2.4 表路由(Table Sharding)
表路由是指根据某种规则将数据操作路由到对应的分布式表上。Sharding JDBC同样提供了灵活的表路由策略配置,支持多种分表策略。
3. Sharding JDBC的工作原理
简单来说,Sharding JDBC的工作原理可以概括为以下几个步骤:
- 客户端发起数据库操作请求。
- Sharding JDBC根据路由策略解析请求,确定对应的数据库切片和分布式表。
- Sharding JDBC将请求转发给对应的数据库切片和分布式表。
- 数据库切片和分布式表执行具体的数据库操作。
- 结果返回给Sharding JDBC,再由Sharding JDBC返回给客户端。
Sharding JDBC通过对数据库操作的解析和转发,实现了透明的分库分表功能,对上层应用透明,使得应用无需关心分布式数据库的复杂性。
4. 如何使用Sharding JDBC?
接下来,我们一起来看下如何使用。使用Sharding JDBC可以分为以下几个步骤:
4.1 引入Sharding JDBC依赖
在项目的pom.xml文件中引入Sharding JDBC的相关依赖,以及对应的数据库驱动依赖。
4.2 配置数据源和数据库规则
在配置文件中配置数据源和数据库规则,包括数据库连接信息、数据库切片和分布式表的规则等。
4.3 编写业务代码
编写业务代码时,使用Sharding JDBC提供的API进行数据库操作,无需关心具体的数据库切片和分布式表。
下面笔者根据上述步骤,以一个例子来详细展示具体的使用方法:
我们以用户表和订单表为例,对其分库分表。
A.引入Sharding JDBC依赖,可以通过Maven来管理项目依赖。
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>xxx</version>
</dependency>
B.配置数据源和数据库规则,在application.yaml中进行配置。
spring:shardingsphere:datasource:# 数据源配置,定义两个数据源names: ds0, ds1ds0:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/database0username: rootpassword: rootds1:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/database1username: rootpassword: rootsharding:tables:# 订单表的配置order:actualDataNodes: ds${0..1}.order_${0..3}# 表路由策略,根据用户ID进行分表tableStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: com.example.algorithm.PreciseModuloTableShardingAlgorithm# 数据库路由策略,根据用户ID进行分库databaseStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: com.example.algorithm.PreciseModuloDatabaseShardingAlgorithm
C.编写自定义的分表策略和分库策略。例如,我们自定义了
PreciseModuloTableShardingAlgorithm和PreciseModuloDatabaseShardingAlgorithm两个算法类,根据用户ID进行分表和分库的计算。
public class PreciseModuloTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> tableNames, PreciseShardingValue<Long> shardingValue) {for (String tableName : tableNames) {if (tableName.endsWith(String.valueOf(shardingValue.getValue() % 4))) {return tableName;}}throw new IllegalArgumentException("Unsupported table name: " + shardingValue.getLogicTableName());}
}public class PreciseModuloDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> databaseNames, PreciseShardingValue<Long> shardingValue) {for (String databaseName : databaseNames) {if (databaseName.endsWith(String.valueOf(shardingValue.getValue() % 2))) {return databaseName;}}throw new IllegalArgumentException("Unsupported database name: " + shardingValue.getLogicTableName());}
}
D. 编写业务代码,使用Sharding JDBC进行数据库操作。
@Repository
public class OrderRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<Order> findOrdersByUserId(Long userId) {String sql = "SELECT * FROM `order` WHERE user_id = ?";return jdbcTemplate.query(sql, new Object[]{userId}, new BeanPropertyRowMapper<>(Order.class));}public void saveOrder(Order order) {String sql = "INSERT INTO `order` (id, user_id, amount) VALUES (?, ?, ?)";jdbcTemplate.update(sql, order.getId(), order.getUserId(), order.getAmount());}
}@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;public List<Order> getOrdersByUserId(Long userId) {return orderRepository.findOrdersByUserId(userId);}public void saveOrder(Order order) {orderRepository.saveOrder(order);}
}
在上述示例中,我们配置了两个数据源(ds0和ds1),每个数据源对应一个数据库实例。订单表根据用户ID进行分表,共分为4张表(order_0、order_1、order_2、order_3),并根据用户ID进行分库,共分为2个数据库实例。在业务代码中,我们通过Sharding JDBC的API来进行数据库操作,无需关心具体的数据库切片和分布式表。
本文深入探索了Sharding JDBC的核心概念、工作原理和使用方法,并通过一个用户订单分库分表的示例加以完善。通过使用Sharding JDBC,开发者可以轻松应对高并发和大数据量的场景,提升系统的性能和可扩展性。希望本文对读者理解和应用Sharding JDBC有所帮助。
相关内容拓展:(技术前沿)
开发语言作为软件搭建的底层,长久以来一直使用英文编程,Java、C 等语言对于专业程序员来说并不难,然而许多非 IT 专业的人,希望搭建出适合自己使用的软件,却被晦涩难懂的英文编程阻拦在外。
所幸的是,自 2000 年以来,低代码领域虽然在夹缝中艰难生存,但是经历 20 年风雨,如今却已柳木成荫,相关领域企业超过百家,近年如火如荼的“JNPF 平台”更是低代码界的一匹黑马。
JNPF 平台由具备 10 多年系统开发经验和企业项目交付经验的技术团队倾力打造而成的企业级低代码平台。支持多国语言切换搭建界面,业务流程只需要“拖拉拽”方式、少量或完全不需要编写代码即可搭建,操作起来就像搭积木一样简单,会玩电脑就可以开发软件。
核心功能:表单引擎、可视化引擎、BI引擎、流程引擎、权限引擎、门户引擎、大屏引擎、接口中心、物联平台
如果那你未曾尝试过这个领域,你或许可以试试看!官网:https://www.jnpfsoft.com/?csdn
相关文章:
深入探索Sharding JDBC:分库分表的利器
随着互联网应用的不断发展和用户量的不断增加,传统的数据库在应对高并发和大数据量的场景下面临着巨大的挑战。为了解决这一问题,分库分表成为了一个非常流行的方案。分库分表主流的技术包括MyCat和Sharding JDBC。我们来通过一张图来了解这两者有什么区…...
Java后端模拟面试 题集④
1.你先作个自我介绍吧 面试官您好,我叫张睿超,来自湖南长沙,大学毕业于湖南农业大学,是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…...
中国5G产业全景图谱报告2022_挚物AIoT产业研究院
中国5G产业全景图谱报告2022_挚物AIoT产业研究院 产业结构 5G 产业结构主要包括接入网、传输网、核心网、电信运营商、网络配套服务商、5G 应用生态及产业服务 7 个主要板块。根据各版块中主要市场参与者提供的产品和服务,又下分子版块。 (1ÿ…...
设计链表复习
设计链表 class ListNode {int val;ListNode next;public ListNode() {}public ListNode(int val) {this.val val;}public ListNode(int val, ListNode next) {this.val val;this.next next;}}class MyLinkedList {//size存储链表元素的个数int size;//虚拟头节点ListNode…...
在 Visual Studio Code (VS Code) 中设置
在 Visual Studio Code (VS Code) 中设置代理服务器的详细教程如下: 打开 Visual Studio Code。 在顶部菜单栏中,点击 "File"(文件) > "Preferences"(首选项) > "Settings…...
2023年拼多多双11百亿补贴新增单件立减玩法介绍
2023年拼多多双11百亿补贴新增单件立减玩法介绍 拼多多启动了11.11大促活动,主题为“天天11.11,天天真低价”。消费者享受多重优惠,包括满减、百亿补贴和单件立减等。百亿补贴新增玩法,有超过20000款品牌商品参与单件立减活动。 …...
面试题 01.06. 字符串压缩
题目来源: leetcode题目,网址:面试题 01.06. 字符串压缩 - 力扣(LeetCode) 解题思路: 计算压缩后的字符串长度,如果该长度小于原字符串长度,返回压缩后的字符串,否则…...
那些你面试必须知道的webpack知识点
目录 1、webpack介绍和简单使用1.1 什么是webpack?1.2 安装webpack1.3 简单使用一下webpack 2、webpack的入口与输出2.1 入口(entry)2.2 输出(output) 3、入口多种配置方法3.1 多文件打包成一个文件3.2 多文件打包成多文件 4、loader的概念5、压缩打包HTML5.1 使用步…...
十四、队列函数
1、概述 (1)使用队列的流程:创建队列、写队列、读队列、删除队列。 2、创建 队列的创建有两种方法:动态分配内存、静态分配内存。 2.1、动态分配内存 (1)函数:xQueueCreate,队列的内存再函数内部动态分配。 (2)函数原型如下&…...
使用高防服务器有什么好处?103.216.155.x
为什么建议租用高防服务器 第一,高防服务器由于业务的特殊性,本身机器的配置要求高,服务器的价格相比普通的贵,而且,机器还有维护费、托管费等,这会让运营的成本上升。 第二,租用高防服务器&a…...
Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架
在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…...
Git合并某个分支上的某个提交
1. 首先,确保你当前所在的分支是你要合并分支的父分支。你可以使用以下命令切换到父分支: git checkout <父分支名称> 2. 确保你要合并的分支是可用的。你可以使用以下命令查看所有可用的分支: git branch -a 这将显示所有本地和远程…...
在pytorch中对于张量维度的理解
原文参考链接: https://blog.csdn.net/qq_36930921/article/details/121670945. https://zhuanlan.zhihu.com/p/356951418 张量的计算:https://zhuanlan.zhihu.com/p/140260245 学习过程中对知识的补充学习,谨防原文失效,请大家支…...
JAVA高级教程Java HashMap表达式(7)
目录 7、HashMap的使用students类 7、HashMap的使用 students类 package Map01;import java.util.Objects ;public class Students implements Comparable<Students>{private String name;private int stuNO;public Students() {}public Students(String age, int stuN…...
【iOS】JSON解析
JSON在Web开发和网络通信和传输中广泛应用,常用于存储和传输数据,这些数据一般也都是JSON格式,可以说绝大多数网络请求传输的数据都是JSON格式 在之前有关网络请求文章中,实现了网络数据加载流程,并对加载下来的JSON数…...
华为OD 最大差(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
打印新闻标题,使用封装get、set方法,打印前15个字符串
package day21; import java.util.ArrayList; import java.util.Collections;/*** author monian* Wo yi wu ta,wei shou shu er!*/ public class Homework01 {SuppressWarnings({"all"})public static void main(String[] args) {News news1 new News("新冠确…...
FL Studio21中文版本好用吗?值不值得下载
今天,我从一个FL Studio忠实且还算资深的用户角度,来为大家深度介绍并评测一下FL Studio的性能以及我四年的使用感受。 FL Studio是一款集剪辑、编曲、录音、混音一体的全能DAW(数字音频工作站)。其所有界面都是支持100%矢量化的…...
微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)
目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…...
工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性
工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性 桥梁是人类社会建设过程中最重要的交通基础设施之一,对于保障人民出行、促进经济发展具有极其重要的作用。由于桥梁结构在长期使用过程中受到环境因素和负荷的影响,会逐渐发生变形和损伤&…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
