SpringBoot集成ShardingSphere-JDBC的基本使用指南

 更新时间:2025年07月23日 08:21:01   作者:冰糖心书房  
在 Spring Boot 中集成 ShardingSphere-JDBC,可以透明地将数据分片、读写分离等功能引入到应用中,下面小编就来和大家简单讲讲ShardingSphere 的基本步骤和核心概念吧

在 Spring Boot 中集成 ShardingSphere-JDBC,可以透明地将数据分片、读写分离等功能引入到应用中,而无需大规模修改业务代码。以下是在 Spring Boot 中使用 ShardingSphere 的基本步骤和核心概念。

核心概念

在开始之前,了解几个 ShardingSphere 的基本术语至关重要:

  • 逻辑表 (Logical Table):应用程序代码中操作的表的名称,例如 t_order
  • 真实表 (Actual Table):物理数据库中真实存在的表,例如分布在不同数据库中的 t_order_0, t_order_1
  • 分片键 (Sharding Key):用于决定数据属于哪个分片的表列,常见的如 user_id, order_id
  • 分片算法 (Sharding Algorithm):用于路由数据的逻辑,例如基于取模运算 sharding_key_value % number_of_shards

ShardingSphere-JDBC 的魅力在于它会拦截应用程序的 SQL 请求,并根据配置的规则将其路由到正确的真实数据源和真实表中执行。

基本使用步骤

1. 添加 Maven 依赖

首先,在 Spring Boot 项目的 pom.xml 文件中添加 ShardingSphere 的官方 Spring Boot Starter 依赖。

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.5.0</version> <!-- 建议使用最新稳定版 -->
</dependency>
<!-- 还需要添加数据库驱动和JPA/MyBatis等依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2. 配置文件 (application.yml)

接下来,在 application.yml (或 application.properties) 文件中进行配置。这是集成工作的核心部分,主要包括数据源配置和分片规则配置。

以下是一个将 t_order 表水平分片到两个数据库 (ds0, ds1),每个数据库中又分为两张表 (t_order_0, t_order_1) 的示例。

spring:
  shardingsphere:
    # 开启 SQL 日志,便于调试
    props:
      sql-show: true
    # 1. 定义真实数据源
    datasource:
      names: ds0, ds1
      # 第一个数据源
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0?useSSL=false
        username: root
        password: your_password
      # 第二个数据源
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3307/ds1?useSSL=false # 注意端口或地址不同
        username: root
        password: your_password

    # 2. 定义规则
    rules:
      # 分片规则
      sharding:
        tables:
          # 配置 t_order 表的规则
          t_order:
            # 数据节点:逻辑表 t_order 映射到 ds0 和 ds1 的 t_order_0 和 t_order_1 表
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
            # 分库策略
            database-strategy:
              standard:
                sharding-column: user_id # 分库键
                sharding-algorithm-name: database_inline # 分库算法名称
            # 分表策略
            table-strategy:
              standard:
                sharding-column: order_id # 分表键
                sharding-algorithm-name: table_inline # 分表算法名称
        # 3. 定义分片算法
        sharding-algorithms:
          # 数据库分片算法:基于 user_id 取模
          database_inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{user_id % 2}
          # 表分片算法:基于 order_id 取模
          table_inline:
            type: INLINE
            props:
              algorithm-expression: t_order_$->{order_id % 2}

配置解释:

  • spring.shardingsphere.datasource.names: 声明所有真实数据源的名称。
  • spring.shardingsphere.rules.sharding.tables: 配置需要分片的表。
  • actual-data-nodes: 这是核心映射关系。ds$->{0..1}.t_order_$->{0..1} 是一种 Groovy 表达式,表示 t_order 表分布在 ds0.t_order_0, ds0.t_order_1, ds1.t_order_0, ds1.t_order_1 这四张真实表中。
  • database-strategytable-strategy: 分别定义分库和分表的策略。这里使用的是标准策略 (standard)。
  • sharding-column: 指定用于计算分片的列。
  • sharding-algorithms: 定义具体的分片算法。INLINE 是一种行内表达式算法,适用于简单的分片逻辑。

3. 创建实体类和 Repository

ShardingSphere 对业务代码是无侵入的,因此你可以像往常一样使用 JPA、MyBatis 等 ORM 框架。

实体类 (Entity):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_order") // 使用逻辑表名
public class Order {
    @Id
    private Long orderId;
    private Long userId;
    private String description;

    // Getters and Setters
}

数据访问接口 (Repository):

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}

4. 在业务逻辑中使用

在你的服务层中,直接注入 OrderRepository 并使用即可。ShardingSphere 会在底层自动处理数据的路由。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    public void createOrders() {
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setOrderId((long) i);
            order.setUserId((long) (i % 4)); // 模拟不同的用户
            order.setDescription("Order for user " + order.getUserId());
            orderRepository.save(order);
        }
    }
}

orderRepository.save(order) 被调用时:

  • ShardingSphere-JDBC 拦截该 SQL 操作。
  • 它会解析出 user_idorder_id 的值。
  • 根据 application.yml 中配置的 database_inline 算法 (ds${user_id % 2}),决定数据应存入 ds0 还是 ds1
  • 根据 table_inline 算法 (t_order_${order_id % 2}),决定数据应存入 t_order_0 还是 t_order_1
  • 最终,SQL 被路由到正确的物理表中执行。

通过以上步骤,我们就可以在 Spring Boot 项目中成功集成并基础地使用 ShardingSphere-JDBC 实现数据分片。ShardingSphere 还支持读写分离、数据加密和分布式事务等更高级的功能,这些也可以通过类似的配置文件进行启用和设置。

到此这篇关于SpringBoot集成ShardingSphere-JDBC的基本使用指南的文章就介绍到这了,更多相关SpringBoot集成ShardingSphere-JDBC内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于springboot集成hbase过程解析

    基于springboot集成hbase过程解析

    这篇文章主要介绍了基于springboot集成hbase过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot项目使用mybatis-plus逆向自动生成全套代码

    SpringBoot项目使用mybatis-plus逆向自动生成全套代码

    在JavaWeb工程中,每一个SSM新项目或者说是SpringBoot项目也好,都少不了model、controller、service、dao等层次的构建。使用mybatis-plus逆向可以自动生成,感兴趣的可以了解一下
    2021-09-09
  • Kotlin 基础教程之类、对象、接口

    Kotlin 基础教程之类、对象、接口

    这篇文章主要介绍了Kotlin 基础教程之类、对象、接口的相关资料,需要的朋友可以参考下
    2017-06-06
  • JAVA 集合框架Map 接口的深度解析与实战指南

    JAVA 集合框架Map 接口的深度解析与实战指南

    文章主要介绍了Map接口及其常用实现类(HashMap、LinkedHashMap、TreeMap)的核心特性、底层原理和适用场景,详细讲解了HashMap的哈希表结构、链表和红黑树处理、线程不安全性及自定义Key注意事项,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • Spring Boot Actuator监控器配置及使用解析

    Spring Boot Actuator监控器配置及使用解析

    这篇文章主要介绍了Spring Boot Actuator监控器配置及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java Spring boot 2.0 跨域问题的解决

    Java Spring boot 2.0 跨域问题的解决

    本篇文章主要介绍了Java Spring boot 2.0 跨域问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 深入理解Java中关键字final、finally、finalize的区别

    深入理解Java中关键字final、finally、finalize的区别

    final、finally、finalize 的区别 这三个 Java 关键字虽然拼写相似,但功能完全不同,本文将从定义、使用场景、代码示例、底层机制以及最佳实践等多个维度,彻底讲清这三者的差异,并附上流程图和对比表格,助你一次搞懂
    2026-05-05
  • 使用ServletUtil.write方法下载接口文件中文乱码问题解决

    使用ServletUtil.write方法下载接口文件中文乱码问题解决

    本文主要介绍了使用ServletUtil.write方法下载接口文件中文乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • MyBatisPlus+Spring实现声明式事务的方法实现

    MyBatisPlus+Spring实现声明式事务的方法实现

    本文主要介绍了MyBatisPlus+Spring实现声明式事务的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Gson序列化指定忽略字段的三种写法详解

    Gson序列化指定忽略字段的三种写法详解

    在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢,本文就来介绍一下
    2021-10-10

最新评论