SpringBoot整合ShardingSphere的示例代码

yizhihongxing

下面我将详细讲解“SpringBoot整合ShardingSphere的示例代码”的完整攻略,包含以下内容:

  1. 环境准备
  2. 引入依赖
  3. 配置数据库
  4. 配置ShardingSphere
  5. 编写示例代码

环境准备

在开始深入了解ShardingSphere之前,我们需要确保本地环境已经安装好了以下软件:

  • JDK8+
  • Maven
  • MySQL 5.7+

引入依赖

在pom.xml文件中引入ShardingSphere和MySQL驱动的依赖,如下所示:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>

配置数据库

在MySQL数据库中创建两张表user和order,分别用来保存用户和订单的数据。对于每一张表,我们至少需要为其准备一个物理数据节点。在本示例中,我们将每一个数据节点设置为一个MySQL数据库实例。

配置ShardingSphere

在SpringBoot的配置文件application.yml(或application.properties)中配置ShardingSphere。配置ShardingSphere主要包含以下两个步骤:

1.配置数据源

spring:
  datasource:
    # 主库
    master:
      jdbc-url: jdbc:mysql://localhost:3306/master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    # 从库
    slave0:
      jdbc-url: jdbc:mysql://localhost:3307/slave0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    # 数据源规则
    sharding:
      # 分库策略
      default-data-source: master
      data-sources:
        master:
          jdbc-url: jdbc:mysql://localhost:3306/master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave0:
          jdbc-url: jdbc:mysql://localhost:3307/slave0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
      # 分表策略
      default-table-strategy:
        standard:
          sharding-column: id
          precise-algorithm-class-name: io.shardingsphere.api.algorithm.sharding.standard.PreciseModuloShardingAlgorithm
          range-algorithm-class-name: io.shardingsphere.api.algorithm.sharding.standard.RangeModuloShardingAlgorithm
      tables:
        user:
          actual-data-nodes: master.user,slave0.user
          key-generator:
            column: id
            type: SNOWFLAKE
        order:
          actual-data-nodes: master.order,slave0.order
          key-generator:
            column: id
            type: SNOWFLAKE

在ShardingSphere的配置中,我们指定了两个数据源:master和slave0。其中,master数据源被指定为默认数据源,意味着当我们没有指定数据源时,ShardingSphere会自动将数据路由到master数据源上。

2.配置分片规则

在这个示例中,我们采用的是分库分表策略,具体策略如下:

  • 数据库分库策略:根据user表中的id和order表中的id对2进行取模,结果为0的数据路由到master库,结果为1的数据路由到slave0库。
  • 表分表策略:根据user表中的id和order表中的id对2进行取模,结果为0的数据路由到user_0和order_0表中,结果为1的数据路由到user_1和order_1表中。

我们可以在ShardingSphere的配置文件中指定分片策略,如下所示:

spring:
  shardingsphere:
    sharding:
      # 分库策略
      default-data-source: master
      data-sources:
        master:
          # ...
        slave0:
          # ...
      # 分表策略
      default-table-strategy:
        standard:
          sharding-column: id
          precise-algorithm-class-name: io.shardingsphere.api.algorithm.sharding.standard.PreciseModuloShardingAlgorithm
          range-algorithm-class-name: io.shardingsphere.api.algorithm.sharding.standard.RangeModuloShardingAlgorithm
      tables:
        user:
          actual-data-nodes: master.user,slave0.user
          key-generator:
            column: id
            type: SNOWFLAKE
        order:
          actual-data-nodes: master.order,slave0.order
          key-generator:
            column: id
            type: SNOWFLAKE

编写示例代码

最后,我们来编写一些示例代码来验证ShardingSphere的配置是否生效了。

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> getAllUsers() {
        return jdbcTemplate.query("SELECT * FROM user", (rs, rowNum) ->
                new User(rs.getLong("id"), rs.getString("name"), rs.getInt("age")));
    }

    public Long addUser(User user) {
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(connection -> {
            PreparedStatement ps = connection.prepareStatement("INSERT INTO user (name, age) VALUES (?, ?)",
                    Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            return ps;
        }, keyHolder);

        return keyHolder.getKey().longValue();
    }

}
@Service
public class OrderService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Order> getAllOrders() {
        return jdbcTemplate.query("SELECT * FROM order", (rs, rowNum) ->
                new Order(rs.getLong("id"), rs.getLong("userId"), rs.getInt("amount")));
    }

    public Long addOrder(Order order) {
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(connection -> {
            PreparedStatement ps = connection.prepareStatement("INSERT INTO order (userId, amount) VALUES (?, ?)",
                    Statement.RETURN_GENERATED_KEYS);
            ps.setLong(1, order.getUserId());
            ps.setInt(2, order.getAmount());
            return ps;
        }, keyHolder);

        return keyHolder.getKey().longValue();
    }

}

上面是两个服务,一个用户服务UserService,一个订单服务OrderService,分别对应user表和order表的增删改查操作。

现在我们可以启动SpringBoot应用程序并使用Postman等工具测试ShardingSphere的配置了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合ShardingSphere的示例代码 - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • ajax对注册名进行验证检测是否存在于数据库中

    检测注册名是否已存在于数据库中是Web开发中常见的需求之一,而Ajax技术则常被用来实现前端异步验证。下面,我将为您讲解实现这一需求的完整攻略。 1. 前端实现 前端实现的主要流程如下: 给用户名输入框绑定事件 监听输入框的值变化,触发Ajax请求 将输入框的值作为参数发送给后端API 根据API的返回结果,展示相应的提示信息 示例代码如下: <inp…

    Java 2023年6月15日
    00
  • asp.net Linq To Xml上手Descendants、Elements遍历节点

    ASP.NET是一套由微软公司开发的基于Web的应用程序框架,LINQ to XML则是一种用于处理XML文档的技术。如果想要在ASP.NET中使用LINQ to XML技术,可以通过使用Descendants和Elements方法来遍历XML文档。以下是使用ASP.NET LINQ to XML技术的完整攻略。 1. 创建XML文档 在使用LINQ to …

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ControllerResourcesNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ControllerResourcesNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 控制器错误:如果控制器不正确,则可能会出现此错误。在这种情况下,需要检查控制器以解决此问题。 以下是…

    Java 2023年5月5日
    00
  • java乐观锁原理与实现案例分析

    Java乐观锁原理与实现案例分析 什么是乐观锁? 乐观锁是一种轻量级锁,它假定不会有其它线程修改共享资源,因此,不需要加锁,只要在最后提交时检查是否有其它线程修改了此数据就好了。 如何实现乐观锁? 实现乐观锁的关键是要保证数据提交时的原子性,通常有两种方式来实现: 基于版本号的乐观锁:通过给数据增加一个版本号,每次操作都需要比较版本号是否一致,只有版本号一致…

    Java 2023年5月18日
    00
  • 如何将Object类转换为实体类

    将Object类转换为实体类,其实就是将一个Java对象转换为另一个Java对象的过程。这个过程在Java开发中非常常见,例如从数据库中查询出数据后,需要将ResultSet中的结果转换为实体类对象。在下面的文章中,将详细讲解如何将Object类转换为实体类,并且提供两个Java代码示例。 步骤一:创建实体类 在将Object转换为实体类之前,需要先创建实体…

    Java 2023年5月26日
    00
  • 浅谈一下Spring的核心基础IOC与DI

    Spring的核心基础IOC与DI 介绍 Spring是一个非常流行的Java应用程序开发框架,它通过Inversion of Control (IOC)和Dependency Injection (DI)提供了强大的依赖注入功能,使得Java开发者可以更容易地编写出低耦合度、易扩展的应用程序。 IOC IOC也叫控制反转,它是Spring的核心基础之一。所…

    Java 2023年5月31日
    00
  • java中处理json各种各样的转换方法(推荐)

    Java中处理JSON的转换方法 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是基于JavaScript的一个子集,易于人类阅读和编写,同时也易于机器解析和生成。JSON是一种文本格式,可以简洁地表示复杂的数据结构。它常被用作Web应用程序间的数据交换格式,也常被用于存储和传输数据。 JSON…

    Java 2023年5月26日
    00
  • Java excel数据导入mysql的实现示例详解

    Java excel数据导入mysql的实现示例详解 背景 在项目中,我们常常需要将Excel表格中的数据导入到MySQL数据库中,这是一种常用的数据导入方式。本文将介绍如何使用Java将Excel中的数据导入到MySQL数据库中,并提供两个示例供大家参考。 第一步:导入Excel相关的依赖 本示例中,我们使用Apache POI来操作Excel文件。在Ma…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部