程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

  • 前端手册

  • 组件文档

  • 数据库分析

  • 集成插件

    • 集成 Docker 实现一键部署
    • 升级 Spring Boot 到 3.x 版本
    • 集成 Ehcache 实现本地缓存切换
    • 集成 WebSocket 实现实时通信
    • 集成 Electron 实现桌面应用程序
    • 集成 Atomikos 实现分布式事务
    • 集成 MinIO 实现分布式文件存储
    • 集成 Easy-ES 实现分布式全文检索
    • 使用 `localStorage` 代替 `cookie`
    • 使用 Undertow 替代 Tomcat 容器
    • 集成 Actuator 实现优雅关闭应用
    • 集成 AJ-Captcha 实现滑块验证码
    • 集成 Sharding-JDBC 实现分库分表
      • 1. 添加 Sharding-JDBC 依赖
      • 2. 创建测试数据库
      • 3. 创建测试订单表
      • 4. 配置数据源
      • 5. 下载并覆盖相关插件
      • 6. 测试验证
      • 7. 详细代码解析
    • 集成 JustAuth 实现第三方授权登录
    • 集成 `watermark-dom` 实现页面水印
    • 集成 MyBatis-Plus 实现 MyBatis 增强
    • 集成 EasyExcel 实现 Excel 表格增强
    • 集成 Knife4j 实现 Swagger 文档增强
    • 集成 Redisson 实现 Redis 分布式锁
    • 集成 IP2Region 实现离线 IP 地址定位
    • 42集成 JSEncrypt 实现密码加密传输
    • 集成 HttpClient 实现 HTTP 接口增强
    • 集成 Druid 实现数据库密码加密功能
    • 集成 Browscap 实现用户代理解析
    • 集成 Dynamic-DataSource 实现多数据源增强
  • 若依框架
  • 集成插件
scholar
2024-08-31
目录

集成 Sharding-JDBC 实现分库分表

# 集成 Sharding-JDBC 实现分库分表

Sharding-JDBC 是 Apache ShardingSphere 提供的一款分布式数据库中间件,支持数据分片、读写分离和分布式事务等功能。本文将详细介绍如何在 RuoYi 框架中集成 Sharding-JDBC,实现订单数据的分库分表。

# 1. 添加 Sharding-JDBC 依赖

在 ruoyi-framework\pom.xml 文件中,添加 Sharding-JDBC 的依赖:

<!-- sharding-jdbc 分库分表 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>4.1.1</version>
</dependency>
1
2
3
4
5
6

# 2. 创建测试数据库

创建两个测试数据库,用于存储订单数据。

-- 创建数据库 ry-order1
create database `ry-order1`;

-- 创建数据库 ry-order2
create database `ry-order2`;
1
2
3
4
5

# 3. 创建测试订单表

在每个数据库中创建两张订单表 sys_order_0 和 sys_order_1,用于存储订单数据。

-- 创建表 sys_order_0
drop table if exists sys_order_0;
create table sys_order_0 (
  order_id      bigint(20)      not null                   comment '订单ID',
  user_id       bigint(64)      not null                   comment '用户编号',
  status        char(1)         not null                   comment '状态(0交易成功 1交易失败)',
  order_no      varchar(64)     default null               comment '订单流水',
  primary key (order_id)
) engine=innodb comment = '订单信息表';

-- 创建表 sys_order_1
drop table if exists sys_order_1;
create table sys_order_1 (
  order_id      bigint(20)      not null                   comment '订单ID',
  user_id       bigint(64)      not null                   comment '用户编号',
  status        char(1)         not null                   comment '状态(0交易成功 1交易失败)',
  order_no      varchar(64)     default null               comment '订单流水',
  primary key (order_id)
) engine=innodb comment = '订单信息表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 4. 配置数据源

在 application-druid.yml 文件中,配置多个数据源,包括主库和两个订单库。

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: password
      # 订单库1
      order1:
        enabled: true
        url: jdbc:mysql://localhost:3306/ry-order1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: password
      # 订单库2
      order2:
        enabled: true
        url: jdbc:mysql://localhost:3306/ry-order2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 5. 下载并覆盖相关插件

下载并解压插件包 ruoyi/集成sharding-jdbc实现分库分表.zip,覆盖到 RuoYi 工程中。该插件包中包含了 Sharding-JDBC 的配置文件和相关代码。

# 6. 测试验证

通过访问以下 URL 验证分库分表的配置是否成功:

  • 测试分库:

    • 访问 http://localhost/order/add/1 (opens new window) 验证数据是否入库到 ry-order2。
    • 访问 http://localhost/order/add/2 (opens new window) 验证数据是否入库到 ry-order1。
  • 测试分表:

    • 根据 order_id % 2,验证数据是否分别入库到 sys_order_0 和 sys_order_1。

# 7. 详细代码解析

订单服务接口 (OrderService.java):

package com.ruoyi.system.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.ruoyi.system.domain.SysOrder;
import com.ruoyi.system.mapper.SysOrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private SysOrderMapper orderMapper;

    /**
     * 插入订单
     * 根据order_id自动选择分库分表
     *
     * @param sysOrder 订单信息
     */
    @Transactional
    public void insertOrder(SysOrder sysOrder) {
        orderMapper.insertOrder(sysOrder);
    }

    @DS("test")
    public SysOrder selectOrderById(Long orderId) {
        return orderMapper.selectOrderById(orderId);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

订单 Mapper (SysOrderMapper.java):

package com.ruoyi.system.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.ruoyi.system.domain.SysOrder;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

public interface SysOrderMapper {

    /**
     * 插入订单
     *
     * @param sysOrder 订单信息
     */
    @Insert("INSERT INTO sys_order_${order_id % 2} (order_id, user_id, status, order_no) VALUES (#{orderId}, #{userId}, #{status}, #{orderNo})")
    void insertOrder(SysOrder sysOrder);

    /**
     * 根据订单ID查询订单
     *
     * @param orderId 订单ID
     * @return 订单信息
     */
    @DS("test")
    @Select("SELECT * FROM sys_order_${order_id % 2} WHERE order_id = #{orderId}")
    SysOrder selectOrderById(Long orderId);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

订单控制器 (OrderController.java):

package com.ruoyi.web.controller.system;

import com.ruoyi.system.domain.SysOrder;
import com.ruoyi.system.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/add/{id}")
    public String addOrder(@PathVariable Long id) {
        SysOrder order = new SysOrder();
        order.setOrderId(id);
        order.setUserId(id);
        order.setStatus("0");
        order.setOrderNo("Order_" + id);
        orderService.insertOrder(order);
        return "Order added successfully!";
    }

    @GetMapping("/get/{id}")
    public SysOrder getOrder(@PathVariable Long id) {
        return orderService.selectOrderById(id);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

总结

通过本文的详细步骤,我们成功地在 RuoYi 项目中集成了 Sharding-JDBC,实现了订单数据的分库分表。Sharding-JDBC 不仅可以分库分表,还可以实现读写分离和分布式事务等功能,为项目提供了良好的扩展性和高性能保障。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
集成 AJ-Captcha 实现滑块验证码
集成 JustAuth 实现第三方授权登录

← 集成 AJ-Captcha 实现滑块验证码 集成 JustAuth 实现第三方授权登录→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式