深入探索Sharding JDBC:分库分表的利器

news2024/11/13 4:17:35

随着互联网应用的不断发展和用户量的不断增加,传统的数据库在应对高并发和大数据量的场景下面临着巨大的挑战。为了解决这一问题,分库分表成为了一个非常流行的方案。分库分表主流的技术包括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, ds1
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database0
        username: root
        password: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/database1
        username: root
        password: root
    sharding:
      tables:
        # 订单表的配置
        order:
          actualDataNodes: ds${0..1}.order_${0..3}
          # 表路由策略,根据用户ID进行分表
          tableStrategy:
            standard:
              shardingColumn: user_id
              preciseAlgorithmClassName: com.example.algorithm.PreciseModuloTableShardingAlgorithm
          # 数据库路由策略,根据用户ID进行分库
          databaseStrategy:
            standard:
              shardingColumn: user_id
              preciseAlgorithmClassName: com.example.algorithm.PreciseModuloDatabaseShardingAlgorithm

C.编写自定义的分表策略和分库策略。例如,我们自定义了

PreciseModuloTableShardingAlgorithm和PreciseModuloDatabaseShardingAlgorithm两个算法类,根据用户ID进行分表和分库的计算。

public class PreciseModuloTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public 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> {
    @Override
    public 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 {
    @Autowired
    private 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 {
    @Autowired
    private 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.coloradmin.cn/o/1114223.html

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

相关文章

38 WEB漏洞-反序列化之PHPJAVA全解(下)

目录 Java中的API实现序列化和反序列化演示案例WebGoat_Javaweb靶场反序列化测试2020-网鼎杯-朱雀组-Web-think java真题复现 文章参考&#xff1a; https://www.cnblogs.com/zhengna/p/15737517.html https://blog.csdn.net/MCTSOG/article/details/123819548 ysoserial生成攻…

CC攻击和其防御策略

CC攻击简介 CC攻击&#xff0c;又称为Challenge Collapsar攻击&#xff0c;是一种常见的DDoS&#xff08;分布式拒绝服务&#xff09;攻击方式&#xff0c;旨在使Web服务在第七层协议层面遭受攻击。攻击者并不需要大量的肉鸡来实施CC攻击&#xff0c;相反&#xff0c;他们使用…

Flyway Desktop updated

Flyway Desktop updated 为比较工件序列化和反序列化添加了额外的调试日志记录。 Flyway Desktop现在将记住以前用于创建项目和匹配克隆的位置。 新的脱机许可工作流现在已在Microsoft Windows上启用。 现在&#xff0c;在配置目标数据库列表时&#xff0c;环境ID是可见的。 现…

HTML图像标签

html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图像标签学习</title> </head> <body> <img src"../resources/image/01.jpg" alt"小狗图…

【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测

1. 概述 1.1 什么是集成模型/集成学习 "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起&#xff0c;以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果&#xff0c;集成学习可以减少单个模型的偏差和方差&am…

2023年全球及中国分离纯化装备市场发展概况分析:未来市场将持续增长[图]

随着创新药物的研发加速&#xff0c;纯化环节在药物生产过程中的重要性也将日益凸显&#xff0c;纯化设备市场未来有望不断增长。2022年&#xff0c;全球小分子药物分离纯化装备市场规模达到45美元&#xff0c;期间复合年增长率为21.9%&#xff1b;预计未来全球小分子药物分离纯…

使用标准模板 MRI 主题根据 EEG 数据计算前向算子

# https://mne.tools/stable/auto_tutorials/forward/35_eeg_no_mri.html# 本教程说明如何使用标准模板 MRI 主题根据 EEG 数据计算前向算子 # # 成人模板 MRI (fsaverage) # 首先我们展示如何fsaverage用作替代subject# Authors: Alexandre Gramfort <alexandre.gramfortin…

vscode摸鱼插件开发

不知道大家在写代码的时候&#xff0c;摸不摸鱼&#xff0c;是不是时不时得打开一下微博&#xff0c;看看今天发生了什么大事&#xff0c;又有谁塌房&#xff0c;而你没有及时赶上。 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来查看微博热搜 插件名称&#xff1…

每日一练 | 华为认证真题练习Day121

1、如下图所示的交换网络&#xff0c;所有交换机都运行了STP协议。当拓扑稳定后&#xff0c;在下列那台交换机上修改配置BPDU的发送周期&#xff0c;可以影响SWD配置BPDU的发送周期 A. SWD B. SWC C. SWB D. SWA 2、如下图所示的网络&#xff0c;交换机的MAC地址已标出。在S…

(数据结构)单链表的相关操作

//1.预编译部分#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//2.单链表的结构体typedef struct LNode{int data;struct LNode* next; //因为next指针指向的为结构体类型&#xff0c;所以类型为struct LNode*}LNode, * LinkList; …

如何保障Facebook账号登录稳定?跨境人必看

作为全球最大的社交媒体平台&#xff0c;Facebook已成为众多跨境人们拓展海外市场的重要渠道。然而&#xff0c;Facebook对跨境业务卖家的监管越来越严格&#xff0c;封号政策也日趋严厉。对于想要在Facebook上开展业务的跨境人们而言&#xff0c;大家是否被Facebook封号问题困…

如何对需求变更进行精准的风险评估?

1、明确需求变更背景和目的 首先需要了解需求变更的背景&#xff0c;即需求产生的原因和环境&#xff0c;如需求变更是由业务变化、用户需求变化、技术限制、资源限制等因素引起的。其次需要明确需求变更目的是为了解决问题还是满足需求。 明确需求变更背景和目的&#xff0c;有…

X32位汇编和X64位区别无参函数分析(一)

前言 一、X32汇编函数无参无返回分析 二、X64汇编函数无参无返回分析 总结 前言 提示&#xff1a;以下是个人学习总结&#xff1a;如有错误请大神指出来&#xff0c;只供学习参考&#xff0c;本内容使用使用VS2017开发工具&#xff1a;语言是C&#xff0c;需要一些常见的汇编指…

数据库管理-第112期 Oracle Exadata 03-网络与ILOM(20231020)

数据库管理-第112期 Oracle Exadata 03-网络与ILOM&#xff08;202301020&#xff09; 在Exadata中&#xff0c;除了对外网络以外&#xff0c;其余网络都是服务于一体机内部各组件的网络&#xff0c;本期对这些网络的具体情况和硬件管理相关做一个讲解。 1 网络分类 1.1 生产…

工业交换机选购标准,你知道多少?

工业交换机是专门针对灵活多变的工业应用需求而设计的&#xff0c;旨在为工业以太网通讯提供高性价比的解决方案。当我们选购工业交换机时&#xff0c;有哪些选购标准呢&#xff1f; 一、工业交换机选购标准&#xff1a; 1、考虑到工作环境的因素 这些内容包括温度范围、电磁…

前端 js 之 浏览器工作原理 和 v8引擎 01

嘿&#xff0c;老哥&#xff0c;来了就别跑 &#xff01;学完 &#xff0c;不亏 &#x1f602; 文章目录 一、输入url 之后做了什么二、简单了解下浏览器内核三、浏览器渲染过程 &#xff08;渲染引擎&#xff09;四、js 引擎五、chrome五、v8 引擎原理八、浏览器性能优化九、前…

学会C++之后,为什么学任何语言都会更加容易?

学会C之后&#xff0c;为什么学任何语言都会更加容易&#xff1f; 编程的本质是把自然语言翻译为机器语言&#xff0c;但机器没有联想力&#xff0c;所以它需要编写者事无巨细地告诉它怎么做。最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从业…

家电电器小程序商城的作用是什么

随着人们生活提升&#xff0c;各式家电类型非常多&#xff0c;优化了人们生活日常&#xff0c;入局的大中小品牌也非常多&#xff0c;人们可以在商场、商圈或线上电商平台找到自己所需的电器家电产品。 无论大件还是小件&#xff0c;消费者的选择性非常广&#xff0c;对品牌或…

第二证券:跌破3000点,热搜第一!

今天上午&#xff0c;“沪指开盘跌破3000点关口”冲上百度热搜榜榜首。 上午收盘&#xff0c;上证指数下跌0.27%&#xff0c;报2997.22点&#xff1b;深证成指下跌0.36%&#xff0c;创业板指下跌0.44%。 赛道股发力&#xff0c;光伏、风电、新能源轿车等板块盘中冲高。房地产…

【控制系统】PID(学习笔记)

一、PID概要 1、引入 流量稳定、调整流量 2、适用系统 二阶以内的线性系统 线性系统&#xff1a;满足齐次性和叠加性 齐次性&#xff1a; y f ( x ) yf(x) yf(x) 则 k y f ( k x ) kyf(kx) kyf(kx) 叠加性&#xff1a; y 1 f ( x 1 ) , y 2 f ( x 2 ) y_1f(x_1),y_2f(x…