说明:Sharding-jdbc是常见的分库分表工具,本文介绍Sharding-jdbc的基础使用。

分库分表

首先,介绍一下分库分表:

(1)分库

水平分库:以字段为依据,按照一定策略(hash、range),将一个库中的数据拆分到多个库中;

垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中;


(2)分表

水平分表:按照策略,将记录路由到不同的表上,常见的策略有范围、hash、字段值;

垂直分表:根据业务相关性,拆分表字段,将一张表拆分为多张表;


水平分就是横着一刀,垂直分就是竖着一刀。

垂直分库、垂直分表,我认为是设计时考虑的,像微服务架构,根据业务场景拆分多个小的服务,每个服务都可以有自己的数据库,是垂直分库。

而垂直分表,某张表的字段过长,可以考虑将表字段按照业务相关性拆分成多张表,另外,当表中有text类型的字段时,为了避免影响其他字段索引率,也需要独立出来一张表,用主键对应(阿里巴巴《Java开发手册》),是垂直分表的体现。

(3)需要考虑的问题

分库:

  • 跨库事务;

  • 跨库的JOIN;


分表:

  • 多张表如何保证主键不重复;

  • 多张表的count、order by、group by 及 聚合函数问题;

Sharding-jdbc使用

这里介绍使用Sharding-jdbc实现水平分表

(1)创建数据库表

先创建两张数据库表

# 创建数据库
create schema order_db collate utf8mb3_general_ci;# 创建表
use order_db;CREATE TABLE `t_order_1`
(`order_id` bigint                                                       NOT NULL COMMENT '订单id',`price`    decimal(10, 2)                                               NOT NULL COMMENT '订单价格',`user_id`  bigint                                                       NOT NULL COMMENT '下单用户id',`status`   varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb3ROW_FORMAT = DYNAMIC;CREATE TABLE `t_order_2`
(`order_id` bigint                                                       NOT NULL COMMENT '订单id',`price`    decimal(10, 2)                                               NOT NULL COMMENT '订单价格',`user_id`  bigint                                                       NOT NULL COMMENT '下单用户id',`status`   varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb3ROW_FORMAT = DYNAMIC;

(2)创建项目

创建一个Spring Boot项目,pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hezy</groupId><artifactId>sharding-jdbc-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- shardingJDBC核心依赖 --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.1</version><exclusions><exclusion><artifactId>snakeyaml</artifactId><groupId>org.yaml</groupId></exclusion><exclusion><artifactId>cosid-core</artifactId><groupId>me.ahoo.cosid</groupId></exclusion></exclusions></dependency><!-- 版本冲突 --><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency><dependency><groupId>me.ahoo.cosid</groupId><artifactId>cosid-core</artifactId><version>1.19.3</version></dependency><!--XA 分布式事务 --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-transaction-xa-core</artifactId><version>5.2.1</version><exclusions><exclusion><artifactId>transactions-jdbc</artifactId><groupId>com.atomikos</groupId></exclusion><exclusion><artifactId>transactions-jta</artifactId><groupId>com.atomikos</groupId></exclusion></exclusions></dependency><!-- SpringBoot依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><artifactId>snakeyaml</artifactId><groupId>org.yaml</groupId></exclusion></exclusions></dependency><!--测试类依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--durid数据库连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.20</version></dependency><!-- mysql连接驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatisplus依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.3</version></dependency></dependencies>
</project>

(3)编写代码

创建pojo对象,注意表名是t_order,没有加后缀

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.math.BigDecimal;@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_order")
public class Order implements Serializable {@TableIdprivate Long orderId;private BigDecimal price;private Long userId;private String status;
}

创建Service和Mapper

(OrderService)

import com.baomidou.mybatisplus.extension.service.IService;
import com.hezy.pojo.Order;public interface OrderService extends IService<Order> {
}

(OrderServiceImpl)

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hezy.mapper.OrderMapper;
import com.hezy.pojo.Order;
import com.hezy.service.OrderService;
import org.springframework.stereotype.Service;@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
}

(OrderMapper)

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hezy.pojo.Order;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

(4)配置文件

配置文件中,定义了数据库配置及水平分表的策略,采用取模(%2)的方式

spring:main:# 允许Bean重复定义覆盖allow-bean-definition-overriding: trueshardingsphere:datasource:# 数据源名称,多个数据源时使用逗号(,)分割names: m1m1:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/order_db?serverTimezone=Asia/Shanghai&characterEncoding=utf8username: rootpassword: 123456sharding:tables:t_order:# 配置数据节点,m1.t_order_1,m1.t_order_2,使用上面names的配置名称actual-data-nodes: m1.t_order_$->{1..2}key-generator:# 配置主键,及主键生成算法column: order_id# 雪花算法type: SNOWFLAKEtable-strategy:inline:# 配置分片键sharding-column: order_id# 配置分片策略( order_id % 2 + 1 的值就是数据实际要进入的数据表 )# 利用“取模”计算的方式进行分片,将分片键除以分片表的个数,得到的模就是该数据要进入的数据表# 示例中,共有2张分片表,则此处求取分片键的值与分片表的模数,表示为 order_id % 2,又因为分片表的初始值以 1 开始,则再加上1algorithm-expression: t_order_$->{order_id % 2 + 1}
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 配置数据库字段与实体类映射方式,是否是小驼峰命名法map-underscore-to-camel-case: trueglobal-config:db-config:# 配置数据表前缀table-prefix: t_

(5)测试

写一个测试类,如下:

import com.hezy.pojo.Order;
import com.hezy.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.math.BigDecimal;
import java.util.List;@SpringBootTest
public class OrderMapperTest {@Autowiredprivate OrderService orderService;@Testpublic void insertTest() {for (int i = 0; i < 10; i++) {Order order = new Order();order.setStatus("正常");order.setPrice(new BigDecimal(20));order.setUserId(1L);boolean save = orderService.save(order);System.out.println(save);}}@Testpublic void findAllTest() {List<Order> list = orderService.list();System.out.println(list);}
}

执行插入方法,插入完成

在这里插入图片描述

可见数据分散插入到对应的表中

在这里插入图片描述

试一下查询,也是查出10条记录,而不是单张表的5条记录。

在这里插入图片描述

注意

如果是手写SQL,不用Mybatis-Plus的API,那么写SQL的时候注意不要带上表名后缀

    @Select("select * from t_order")List<Order> findALl();

不要写成下面这样,这样就是查单张表的5条记录了。

    @Select("select * from t_order_1")List<Order> findALl();

参考

代码:

  • https://gitee.com/learning_demo/sharding-jdbc

  • https://gitee.com/xscodeit/xushu_springboot_demos/tree/master/Sharding

博客:

  • Sharding-JDBC分库分表

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

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

相关文章

处理器指令中的函数调用指令是什么?

处理器指令中的函数调用指令是什么? 函数调用指令是处理器指令集中用于实现函数(或子程序)调用和返回的专用指令。它们是支持结构化编程和代码复用的硬件基础。核心指令通常包括: 调用指令 (CALL / BL / BLX 等): 功能: 暂停当前函数的执行,跳转到目标函数(被调用函数)…

CHASE、CoSQL、SPARC概念介绍

CHASE&#xff1a;一个跨领域多轮交互text2sql中文数据集&#xff0c;包含5459个多轮问题组成的列表&#xff0c;一共17,940个<query, SQL>二元组&#xff0c;涉及280个不同领域的数据库。CoSQL&#xff1a;一个用于构建跨域对话文本到sql系统的语料库。它是Spider和SPar…

设备巡检系统小程序ThinkPHP+UniApp

基于ThinkPHP和Uniapp开发的设备巡检系统&#xff0c;可应用于电力、水利、物业等巡检场景&#xff0c;可编译微信小程序。提供全部无加密源码&#xff0c;可私有化部署。 ​功能特性 部门管理 后台可以设置多部门&#xff0c;便于筛选员工 员工管理 后台维护员工信…

Visual Studio Code 1.101下载

[软件名称]: Visual Studio Code 1.101 [软件大小]: 147 MB [下载通道]: 夸克盘 | 迅雷盘 | 百度盘 &#x1f3af; 一、MCP&#xff08;Model Context Protocol&#xff09;全面升级 资源 Templates 支持 MCP 现在不仅能处理提示&#xff0c;还能识别和管理“资源模板”&…

linux的基本运维

grep 选项功能-r递归搜索子目录-i忽略大小写-n显示行号-l只显示文件名-v反转匹配&#xff08;显示不包含的行&#xff09;-w全词匹配-E使用扩展正则表达式–include指定文件类型 --include*.{js,py}–exclude排除文件类型 --exclude*.log–exclude-dir排除目录 --exclude-dir{…

c++11右值引用(rvalue reference)

右值引用&#xff08;rvalue reference&#xff09;是 C11 引入的一个新特性&#xff0c;主要用于支持移动语义&#xff0c;优化资源的管理&#xff0c;尤其是在进行资源转移时避免不必要的拷贝操作。右值引用通过 && 符号进行表示。 1. 右值引用的基本概念 右值&…

【算力网络】算网安全

一、算网安全概念 算力网络与网络空间安全的结合设计需构建“内生安全、智能调度、动态防护”的一体化体系&#xff0c;而SRv6安全服务链正是实现该目标的核心技术路径。 1.1、算力网络安全架构设计 1.1.1 体系化架构思路与方法体系 1. ​分层安全架构&#xff08;“三横一…

传输层协议UDP/TCP

目录 UDP协议 UDP协议段格式 UDP缓冲区 TCP协议 TCP协议段格式 确认应答机制 超时重传机制 连接管理机制 连接建立&#xff08;三次握手&#xff09; 连接关闭&#xff08;四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延迟应答 捎带应答 UDP协议 UDP协议…

华为OD-2024年E卷-找终点[100分] -- python

问题描述&#xff1a; 给定一个正整数数组&#xff0c;设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始&#xff0c;正好走到数组最后一个成员&#xff0c;所使用的最少步骤数。要求: 第一步必须从第一元素开始&#xff0c;且1<第一步的步长<len/2…

ARINC653分区调度算法的研究与改进

# ARINC653分区调度算法的研究与优化&#xff1a;从单核到多核的实时性保障 ## 1 研究背景与意义 航空电子系统经历了从**联合式架构**到**综合模块化航空电子**&#xff08;Integrated Modular Avionics, IMA&#xff09;架构的重大演变。在这一演变过程中&#xff0c;ARINC…

Vue-8-前端框架Vue之应用基础响应式数据和计算属性

文章目录 1 响应式数据1.1 ref创建基本类型的响应式数据1.2 reactive创建对象类型的响应式数据1.2.1 汽车示例(对象{})1.2.2 游戏示例(数组[])1.2.3 深层示例1.3 ref创建对象类型的响应式数据1.4 ref对比reactive1.4.1 区别和使用原则1.4.2 reactive重新分配新对象1.4.3 ref重新…

Kotlin - 边界控制 coerceIn、coerceAtLeast、coerceAtMost

一、概念 当需要对数值进行范围限制时&#xff0c;通常会用 if() else if() else&#xff0c;这样会写很多判断&#xff0c;使用 coerceXXX() 函数来简化&#xff0c;适用于实现了 Comparable 接口的对象。 coerceIn() public fun <T : Comparable<T>> T.coerceIn(…

Day02_数据结构(手写)

01.画图 02.按位置查找返回元素的值 //11.按位置查找后返回元素的值 int find_pos(node_p H,int pos) { if(HNULL){return -1;} if(pos<0){ …

1.2 人工智能的分类

人工智能的类型 ANI 无需明确设计即可构建或训练&#xff0c;以执行特定任务或解决特定问题的智能系统。也被称为弱人工智能&#xff0c;因为它不具备全面的通用智能能力。 典型应用&#xff1a; 语音助手&#xff0c;图像识别系统、自动驾驶、机器人等。 大语言模型ChatGPT …

热点Key拆分方案实现

热点Key拆分方案实现 一、核心拆分策略 热点Key拆分的核心思想是将单个高频访问Key分解为多个子Key&#xff0c;分散存储到不同Redis节点&#xff0c;降低单节点压力。以下是具体实现方案&#xff1a; 二、实现方式 1. 业务层哈希分片实现 创建Key分片工具类&#xff0c;通…

程序人生,人生如戏

程序员的出路在哪里 很多计算机科班出身&#xff08;也有转行的&#xff09;同学&#xff0c;第一份工作都是研发&#xff0c;测试&#xff0c;项目管理之类的工作&#xff0c;这里面最多的应该就是从事研发相关的岗位。那我们就以研发岗来举例&#xff0c;聊聊我职业生涯从业…

传感器:基于STM32F103/407系AHT20温湿度传感器数据采集

一、IIC总线 1、IIC总线概念 I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式&#xff0c;具有…

很好,搞搞期末

我要开始啦&#xff01;bulabulabulabulabula. 例题 物理地址DS*16有效地址 1.直接寻址 2.直接寻址&#xff08;允许符号代替数值&#xff0c;变量存的地址&#xff09; 3.基址寻址&#xff08;16位&#xff1a;用寄存器SI、DI、BX、BP存的有效地址&#xff09; 下面是寄存器…

机器人如何实现智能化的自主定位与导航?

机器人实现智能化自主定位与导航&#xff0c;需融合多传感器数据、高效算法及硬件支撑&#xff0c;以下从技术框架、核心技术、典型应用场景等方面详细解析&#xff1a; 一、技术框架&#xff1a;定位与导航的核心环节 机器人自主定位导航通常包含三个关键步骤&#xff0c;形…

AI医疗行业全景图

AI医疗是以互联网为依托&#xff0c;通过基础设施的搭建及数据的收集&#xff0c;将人工智能技术及大数据服务应用于医疗行业中&#xff0c;提升医疗行业的诊断效率及服务质量&#xff0c;更好的解决医疗资源短缺、人口老龄化的问题AI在医疗领域应用广泛&#xff0c;覆盖医疗服…