深入探索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

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

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

相关文章

性能测试jmeter命令行运行+html测试报告解读

windows下打开jmeter的运行窗口&#xff0c;可以看到提示不要用GUI模式进行负载测试&#xff0c;如果要用负载测试&#xff0c;用cli模式&#xff0c;因为GUI模式运行jmeter比较消耗性能。 命令行模式 windows下找到jemeter所在文件夹&#xff0c;打开cmd输入命令。 jmeter -n…

Centos安装gitlabce

服务器配置要求&#xff08;2c4g&#xff09; 1、 安装其他组件 yum install -y curl policycoreutils-python openssh perl2、 安装Postfix服务以发送电子邮件通知&#xff0c;启动服务并自启 yum -y install postfix systemctl enable postfix --now3、 安装gitlab&#xf…

Linux系统之file命令的基本使用

Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…

Ubuntu 安装 docker-compose

在Ubuntu上安装Docker Compose&#xff0c;可以按照以下步骤进行操作&#xff1a; 下载 Docker Compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker…

39.B树,B+树(王道第7章查找补充知识)

目录 一. B树 &#xff08;1&#xff09;B树的定义 &#xff08;2&#xff09;B树的高度 &#xff08;3&#xff09;B树的插入 &#xff08;4&#xff09;B树的删除 二. B树 &#xff08;1&#xff09;B树的定义 &#xff08;2&#xff09;B树与B树的区别 一. B树 &am…

软件测试进阶篇----自动化测试脚本开发

自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发&#xff08;封装线性代码到方法或者类中。在需要的地方进行调用&#xff09; 3、关键字驱动开发&#xff1a;selen…

rust学习——智能指针

智能指针 在各个编程语言中&#xff0c;指针的概念几乎都是相同的&#xff1a;指针是一个包含了内存地址的变量&#xff0c;该内存地址引用或者指向了另外的数据。 在 Rust 中&#xff0c;最常见的指针类型是引用&#xff0c;引用通过 & 符号表示。不同于其它语言&#xf…

【可视化Java GUI程序设计教程】第4章 布局设计

4.1 布局管理器概述 右击窗体&#xff0c;单击快捷菜单中的Set Layout 4.1.2 绝对布局&#xff08;Absolute Layout&#xff09; 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局&#xff08;Null Layout&#xff09; 4.1.3 布局管理器的属性和组件布…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用&#xff1a;测量输入的脉冲长度信号&#xff08;输入捕获&#xff09;、产生输出波形&#xff08;输出比较和PWM&#xff09;。 脉冲长度和波形周期可以从几微秒调制到几毫秒&#xff0c;使用…

STM32:TIM通道输入捕获

本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。 配置时钟 Timer2的时钟频率&#xff0c;对应APB1 Timer。 分频设置为96-1&#xff0c;这样设置定时器每次counter加1&#xff0c;对应的时间为1us&#xff08;计时精度是1us&…

【windows】自动开机 + 免登陆 + 自动运行bat脚本 + 远程免登陆

一、场景 二、解决方案 三、实战 1. 键盘 Win R 键&#xff0c;在弹出的对话框中输入netplwiz&#xff0c;回车 2. 去掉必须输入用户名和密码的勾选&#xff0c;点击应用 3. 在弹出的对话框中输入用户名和密码 一、场景 主机服务器&#xff1a;windows 10 桌面docker &a…

【蓝桥每日一题]-贪心(保姆级教程 篇1)#拼数 #合并果子 #凌乱yyy

目录 题目&#xff1a; 拼数 思路&#xff1a; 题目&#xff1a; 合并果子 思路&#xff1a; 题目&#xff1a;凌乱yyy 思路&#xff1a; 题目&#xff1a;拼数 思路&#xff1a; 思路很简单。举个例子&#xff1a;对于a321,b32。我们发现ab32132,ba32321&#xff0c;那么…

LVS负载均衡集群 (NAT模式)

LVS集群 集群的概念&#xff1a; 为解决某个特定的问题&#xff0c;将多个计算机组合起来形成一个单个系统 集群的水平扩展&#xff1a; 增加设备&#xff0c;并行运行多个服务&#xff0c;通过网路连接和算法来调度服务分配的问题 集群的类型&#xff1a; 负载均衡集群&#…

postgresql14-表的管理(四)

表table 创建表 CREATE TABLE table_name --表名 (column_name data_type column_constraint, --字段名、字段类型、约束字段&#xff08;可选&#xff09;column_name data_type, --表级别约束字段...,table_constraint );CREATE TABLE emp1 --创建表 AS SELECT * FROM empl…

Spring Cloud之服务注册与发现(Eureka)

目录 Eureka 介绍 角色 实现流程 单机构建 注册中心 服务提供者 服务消费者 集群搭建 注册中心 服务提供者 自我保护机制 原理分析 Eureka 介绍 Eureka是spring cloud中的一个负责服务注册与发现的组件&#xff0c;本身是基于REST的服务&#xff0c;同时还提供了…

Redis数据库管理工具Redis Desktop Manager最新中文

Redis Desktop Manager是一款直观且易用的Redis数据库管理工具&#xff0c;支持Windows、macOS和Linux等多平台。它提供了丰富的功能和工具&#xff0c;使用户可以轻松地创建、编辑、删除和浏览Redis键值对&#xff0c;并执行各种Redis命令。通过SSH Tunnel连接&#xff0c;RDM…

28. 使用 k8e 玩转 kube-vip with Cilium‘s Egress Gateway 特性

因为在私有云环境下,我们需要保障集群服务 APIServer地址的高可用,所以提供的方案就是使用一个 VIP 让 API Server 的流量可以负载均衡的流入集群。另外,kube-vip 还支持 Service LB,方便SVC 服务的负载均衡,结合 cilium Egress Gateway 特性可以做到集群内的容器对外访问…

排序-表排序

当我们需要对一个很大的结构体进行排序时&#xff0c;因为正常的排序需要大量的交换&#xff0c;这就会造成时间复杂度的浪费 因此&#xff0c;我们引入指针&#xff0c;通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路&#xff1a;通过开辟一个指针数组&…

Mac风扇控制电脑降温软件Macs Fan Control Pro 简体中文

Macs Fan Control Pro是一款功能强大的Mac风扇控制软件&#xff0c;旨在帮助用户更好地管理和控制Mac电脑的风扇速度和温度传感器。以下是该软件的主要特色介绍&#xff1a; 监测和调整Mac电脑的风扇速度和温度传感器&#xff0c;帮助用户控制设备温度&#xff0c;提高电脑性能…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中&#xff0c;没有Assemble任务 1. 在编译aar包或者编译module的时候&#xff0c;没有release包&#xff0c;我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …