SSM 如何使用 ShardingSphere 实现数据库分库分表

news2024/12/24 13:59:16

SSM 如何使用 ShardingSphere 实现数据库分库分表

简介

在大规模数据应用场景下,单一数据库可能无法承载高并发的读写操作。为了解决这个问题,一种常见的方式是使用数据库分库分表技术。ShardingSphere 是一个支持多种关系型数据库的分布式数据库中间件,本文将介绍如何在 SSM 框架中使用 ShardingSphere 实现数据库分库分表。

本文将使用 Spring Boot 作为 SSM 框架,使用 MySQL 作为数据库,使用 Maven 进行项目管理。

在这里插入图片描述

准备工作

在开始之前,需要安装以下软件:

  • JDK 1.8 或以上版本
  • Maven 3.0 或以上版本
  • MySQL 5.7 或以上版本

创建 Maven 项目

首先,创建一个基于 Maven 的 Spring Boot 项目。可以通过 Spring Initializr 在线生成项目骨架,也可以使用命令行工具创建项目。

mvn archetype:generate -DgroupId=com.example -DartifactId=shardingsphere-demo \
    -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

以上命令将创建一个名为 shardingsphere-demo 的 Maven 项目。

添加依赖

pom.xml 文件中添加 ShardingSphere 的依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>5.0.0-alpha</version>
</dependency>

此外,为了使用 MySQL 数据库,还需要添加 MySQL 驱动的依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

配置数据源

application.yml 文件中配置数据源:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/sharding_db?serverTimezone=UTC
    username: root
    password: password

其中,url 中的 sharding_db 是数据库名,serverTimezone 参数用于解决时区问题。

配置 ShardingSphere

application.yml 文件中添加 ShardingSphere 的配置:

sharding:
  jdbc## 分库分表配置

在 ShardingSphere 中,分库分表是通过配置数据源和分片规则来实现的。下面是一个简单的分库分表配置示例。

首先,在 `application.yml` 文件中添加数据源配置:

```yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/sharding_db?serverTimezone=UTC
    username: root
    password: password

sharding:
  datasource:
    names: ds0, ds1
    ds0:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db0?serverTimezone=UTC
      username: root
      password: password
    ds1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
      username: root
      password: password

以上配置中,我们定义了两个数据源 ds0ds1,分别对应两个数据库 db0db1。在实际应用中,可以根据数据量大小和负载均衡情况来设置数据源数量。

接下来,我们需要定义分片规则。在 ShardingSphere 中,分片规则是通过配置分片策略和分片键来实现的。

分片策略有多种,本文将使用常用的按照表的分片策略。在 application.yml 文件中添加分片策略配置:

sharding:
  tables:
    user:
      actualDataNodes: ds$->{0..1}.user_$->{0..2}
      tableStrategy:
        standard:
          shardingColumn: id
          shardingAlgorithmName: userTableShardingAlgorithm
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake 

以上配置中,我们定义了一个名为 user 的分片表,分别在 ds0ds1 数据源中的 user_0user_1user_2 表中进行分片。其中,actualDataNodes 指定了数据节点,tableStrategy 指定了分片策略和分片键,keyGenerateStrategy 指定了主键生成策略。

分片策略中的 shardingAlgorithmName 对应一个实现了 ShardingAlgorithm 接口的类。下面是一个简单的分片算法示例:

public class UserTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        long userId = shardingValue.getValue();
        String tableName = "user_" + (userId % 3);
        for (String targetName : availableTargetNames) {
            if (targetName.equals(tableName)) {
                return targetName;
            }
        }
        throw new IllegalArgumentException("No sharding table found");
    }
}

以上代码中,我们实现了一个按照主键 id 取模的分片算法。在执行 SQL 语句时,ShardingSphere 会根据分片键的值将查询路由到对应的分片表中。

主键生成策略包括多种方式,本文将使用 Twitter 的 Snowflake 算法生成分布式唯一 ID。在 application.yml 文件中添加主键生成策略配置:

sharding:
  default-key-generator:
    type: SNOWFLAKE
    column: id
    worker-id: 123

以上配置中,我们定义了一个名为 default-key-generator 的主键生成策略,使用 Snowflake 算法生成唯一 ID。其中,worker-id 是 Snowflake 算法中的机器 ID,可以根据实际情况进行配置。

编写代码

完成了配置后,我们可以编写代码来测试分库分表的功能了。在 com.example 包下创建一个名为 ShardingSphereDemoApplication 的主类:

@SpringBootApplication
public class ShardingSphereDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShardingSphereDemoApplication.class, args);
    }
}

接下来,我们创建一个名为 User 的实体类:

public class User {
    private Long id;
    private String name;
    private Integer age;
    // 省略 getter 和 setter
}

然后,我们创建一个名为 UserMapper 的接口:

@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})")
    int insert(User user);

    @Select("SELECT * FROM user WHERE id=#{id}")
    User selectById(Long id);
}

以上代码中,我们使用注解方式来定义 SQL 语句,使用 MyBatis 的 @Mapper 注解将接口注册为 Mapper。

最后,我们创建一个名为 UserService 的服务类:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void insert(User user) {
        userMapper.insert(user);
    }

    public User selectById(Long id) {
        return userMapper.selectById(id);
    }
}

以上代码中,我们使用 @Autowired 注解将 UserMapper 注入到 UserService 中,然后定义了两个方法用于插入和查询用户数据。

测试分库分表

完成了代码的编写后,我们可以使用 JUnit 进行测试。在 src/test/java 目录下创建一个名为 UserServiceTest 的测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testInsert() {
        for (long i = 1; i <= 10; i++) {
            User user = new User();
            user.setId(i);
            user.setName("user" + i);
            user.setAge(20);
            userService.insert(user);}
    }

    @Test
    public void testSelect() {
        for (long i = 1; i <= 10; i++) {
            User user = userService.selectById(i);
            System.out.println(user);
        }
    }
}

以上代码中,我们使用 JUnit 进行测试。testInsert 方法用于插入用户数据,testSelect 方法用于查询用户数据。在 testInsert 方法中,我们插入了 10 条用户数据,分别对应主键 id 为 1 到 10。在 testSelect 方法中,我们查询了这 10 条用户数据,并将查询结果打印出来。

执行测试后,可以看到控制台输出了查询结果,表明分库分表的功能已经正常使用了。

总结

本文介绍了如何在 SSM 框架中使用 ShardingSphere 实现数据库分库分表。通过配置数据源和分片规则,可以轻松地实现数据的分片存储和查询。同时,ShardingSphere 还支持多种数据源和分片策略,可以满足不同场景的需求。

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

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

相关文章

带您看懂全国产串口服务器!如何使用一看便知

不可否认&#xff0c;目前工业现场仍然会有很多串口设备的存在&#xff0c;对于这些串口设备&#xff0c;如果想要联网&#xff0c;就必须要转换成网络接口&#xff0c;这时候就会用到全国产串口服务器。 全国产串口服务器提供串口转网络功能&#xff0c;能够将RS-232/485/422串…

盐城北大青鸟“北大青鸟杯”IT精英挑战赛设中心评审隆重开赛

为积极响应北大青鸟总部开展第十届“北大青鸟杯”全国IT精英挑战赛的号召&#xff0c;成就学员们的IT梦想&#xff0c;“北大青鸟杯”IT精英挑战赛&#xff08;设计组&#xff09;盐城卓晨中心评审于2023年5月25日下午1:00在人才大厦306教室正式开赛&#xff01; ​ 赛前&a…

【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

报表控件FastReport使用指南——使用NuGet包创建PDF文档

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…

低代码平台简介(10家国产化低代码平台详细介绍)

低代码平台&#xff1a;一个号称能在几分钟的时间里开发一套企业内部都可使用的系统开发工具。 本人曾做过一个测试&#xff0c;2人&#xff0c;历时8小时&#xff0c;用低代码平台成功搭建出一套“客户管理系统”。该系统所需要的15个子模块与40个界面。同样的功能如果用传统编…

什么是 sudo,为什么它如此重要?

在当今的技术世界中&#xff0c;Linux 操作系统广泛应用于各种环境&#xff0c;包括个人计算机、服务器和嵌入式设备。作为一种强大的开源操作系统&#xff0c;Linux 提供了丰富的安全功能&#xff0c;以保护系统和用户的数据安全。在 Linux 安全领域中&#xff0c;sudo 是一项…

接口测试的请求和响应

接口测试的请求和响应 在软件开发中&#xff0c;接口测试是必不可少的一环节。接口测试主要涉及到测试请求和响应的过程。请求是指客户端向服务器发送的一些指令或数据&#xff0c;而响应则是服务器对这些请求做出的回应。 请求通常包括请求方法、请求头以及请求体。请求方法有…

信息安全服务资质认证CCRC证书‖中国网络安全审查技术与认证中心

随着CCRC信息安全服务资质持证企业的增加&#xff0c;很多企业看着自己的同行纷纷获的CCRC证书&#xff0c;自身也想进行申报&#xff0c;但由于之前没有做过了解&#xff0c;像个无头苍蝇一样&#xff0c;所以对该资质申报的条件要求、申报的好处又不是那么清楚&#xff0c;接…

重塑DeFi:深入了解Solaris Network

Solaris Network已经在充满活力的去中心化金融&#xff08;DeFi&#xff09;领域崭露头角&#xff0c;成为一家颠覆性的平台&#xff0c;使用户能够创造和交易合成资产。凭借其致力于多链集成、创新功能和以社区为中心的方法&#xff0c;Solaris Network正在改变DeFi的格局&…

【PXIE301-203】基于PXIE总线的4路Cameralink Base图像模拟源

产品概述 PXIE301-203一款基于PXI Express总线的高性能4路CameraLink Base图像模拟源&#xff0c;板卡采用Xilinx的高性能Kintex-7系列FPGA作为主控制器&#xff0c;实现PCI Express总线接口的转换&#xff0c;图像数据的缓存&#xff0c;以及CameraLink图像时序的控制。该板卡…

记录::opencv编译,cmake编译vs动态库

环境&#xff1a;window7&#xff0c;cmake-gui&#xff0c;vs2013 opencv&#xff1a;3.4.4 opencv_contrib&#xff1a;3.4.4&#xff08;nonfree模块&#xff0c;主要为了用sift&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1OXg2IRaxTLTVqM2PVR2ZFA 提取码&a…

2023年企业网盘推荐:实测好用的工具

在数字化时代&#xff0c;企业内部的文件、资料等信息量越来越大。如何高效地管理和共享这些数据&#xff0c;成为企业管理者亟需解决的问题。企业网盘作为一种新型的信息技术工具&#xff0c;以其方便快捷、安全可靠等优点&#xff0c;受到越来越多企业的青睐。 企业网盘工具的…

非计算机专业 3 年外包闭关 180 天入职字节,鬼知道我是怎么过来的

面试 大家都知道&#xff0c;现在的测试面试是越来越难了&#xff01;主要原因无非是两个&#xff1a; 随着测试这个行业的兴起&#xff0c;不管是在家待业的、对自己现在工作不满意的、大学选错专业的、缺钱的、想自己学的等等这些人绝大部分都是选择了去学习测试&#xff01…

Linux:root登陆显示bash-4.2问题处理

情况描述&#xff1a; root账号登陆服务器后&#xff0c;显示如下。 正常显示应该是下面这样&#xff1a; userhostname 原因&#xff1a; 是因为/root目录下没有配置文件 解决&#xff1a; 使用root用户登录&#xff0c;再home目录中创建用户对应的文件夹&#xff0c;mkdi…

【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(二)

【写在前面】 之前和大家分享过一下HarmonyOS应用开发相关问题&#xff0c;今天继续和大家分享&#xff01; 【前提简介】 本文档主要总结HarmonyOS开发过程中可能遇到的一些问题解答&#xff0c;主要围绕HarmonyOS展开&#xff0c;包括但不限于不同API版本HarmonyOS开发、UI…

CopyOnWriteArrayList中add有锁了为什么要copy

CopyOnWriteArrayList中add有锁了为什么要copy 看之前一定要去看之前juc常用中看下volatile的作用 主要还是看写操作&#xff0c;下面是他的源码 /*** Appends the specified element to the end of this list.** param e element to be appended to this list* return {code t…

Nagle算法原理与实现详解

文章目录 背景Nagle算法详解算法实现实现开启与关闭Nagle算法 Nagle算法与延迟ACK参考 背景 TCP的数据流大致可以被分成两类&#xff1a; 交互式数据流 TCP交互数据流指的是&#xff1a;TCP连接中传输的所有数据的总和&#xff0c;包括控制命令&#xff08;用于管理网络中连接…

Lenovo IdeaPad 330-15IKB 81DE电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板Lenovo IdeaPad 330-15IKB 81DE 处理器Intel(R) Core(TM) i3-8130U CPU 2.20GHz (Kaby Lake Refresh)已驱动 内存M471A1G44AB0-CWE * …

jetson nano csi摄像头 tensorrt 运行yolov8检测

jetson nano csi摄像头 tensorrt 运行yolov8检测 1. 在本地电脑训练环境下将onnx模型导出yolov8 导出onnx 模型使用onnxsim优化onnx 模型2. 在jetson nano下 转换到tensorrt模型配置好环境后 使用trtexec 生成engine使用python tensorrt 读取csi摄像头进行预测1. 在本地电脑训练…