SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例

下面我将为您介绍如何通过Spring Boot整合sharding-jdbc实现分库分表和读写分离。

一、概述

sharding-jdbc是一个基于JDBC规范的分布式数据库中间件,它提供了易于使用、高度定制化的分片、读写分离、柔性事务等功能。Spring Boot是一款开发快速的Java企业开发框架,在分布式项目中得到广泛应用。

对于需要进行数据分片和读写分离的应用,可以通过Spring Boot集成sharding-jdbc来轻松实现。下面我们就来讲解如何使用Spring Boot整合sharding-jdbc实现分库分表和读写分离。

二、示例1:实现分库分表

  1. 引入相关依赖:
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>${sharding-jdbc.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.ibatis</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
  1. 在application.yml中配置数据源和分片规则,示例如下:
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-test-query: SELECT 1

sharding:
  jdbc:
    # 数据源分片数量
    datasource-names: ds0, ds1
    # 分片规则
    # 分库规则
    sharding:
      databases:
        # 分库策略
        # 采用user_id取模来确定分库策略
        # 这里表示以user_id % 2的值作为分库键,分到ds0或ds1中
        # user_id为分表键,例表规则在下面配置
        algorithm-expression: ds$->{user_id % 2}
        # 分库数据源配置
        ds0:
          url: jdbc:mysql://localhost:3306/test0?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
          username: root
          password: root
          type: com.zaxxer.hikari.HikariDataSource
        ds1:
          url: jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
          username: root
          password: root
          type: com.zaxxer.hikari.HikariDataSource
    # 分表规则
    sharding:
      tables:
        user:
          # 分表策略
          # 采用user_id取模来确定分表策略
          # 这里表示以user_id % 2的值作为分表键,分到user_0或user_1表中
          # user_id为分库键,分库规则在上面配置
          actual-data-nodes: ds$->{0..1}.user_$->{0..1}
          table-strategy:
            inline:
              sharding-column: user_id
              algorithm-expression: user_$->{user_id % 2}
          key-generator-column-name: id
  1. 编写实体类和Mapper接口,示例代码如下:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private Long userId;
    private String name;
    private Integer age;
}

@Mapper
public interface UserMapper {
    @Insert("insert into user (id,user_id,name,age) values(#{id},#{userId},#{name},#{age})")
    void insert(User user);

    @Select("select id,user_id,name,age from user where id = #{id}")
    User selectById(Long id);

    @Select("select id,user_id,name,age from user where user_id = #{userId}")
    List<User> selectByUserId(Long userId);
}
  1. 编写测试类,测试分库分表效果,示例代码如下:
@SpringBootTest
class ShardingJdbcApplicationTests {
    private static final int USER_NUM = 3;

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        for (int i = 1; i <= USER_NUM; i++) {
            long userId = i;
            User user = User.builder().id(i).userId(userId).name("User" + i).age(18).build();
            userMapper.insert(user);
        }
    }

    @Test
    public void testSelectById() {
        for (int i = 1; i <= USER_NUM; i++) {
            User user = userMapper.selectById(Long.valueOf(i));
            System.out.println(user);
        }
    }

    @Test
    public void testSelectByUserId() {
        for (int i = 1; i <= USER_NUM; i++) {
            List<User> userList = userMapper.selectByUserId(Long.valueOf(i));
            System.out.println(userList);
        }
    }

}

三、示例2:实现读写分离

  1. 引入相关依赖:
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>${sharding-jdbc.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.ibatis</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>${hikari.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>${spring.boot.version}</version>
</dependency>
  1. 在application.yml中配置数据源和分片规则,示例如下:
spring:
  datasource:
    # 主库配置(写数据操作)
    master:
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: root
      password: root
      hikari:
        maximum-pool-size: 10
        minimum-idle: 5
        connection-test-query: SELECT 1
    # 从库配置(读数据操作)
    slave:
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3307/test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: root
      password: root
      hikari:
        maximum-pool-size: 10
        minimum-idle: 5
        connection-test-query: SELECT 1
  # 读写分离配置
  shardingsphere:
    datasource:
      # 数据库的名称,这里是rule
      name: rule
      # 数据库类型
      type: MySQL
      # 主备数据源分别指向主从数据源
      master-slave-rule:
        master-data-source-name: master
        slave-data-source-names: slave
    # 分片策略按照id分库,不分表
    sharding:
      tables:
        user:
          key-generator:
            type: SNOWFLAKE
            column: id
            worker-id:
            max-vibration-offset:
          database-strategy:
            inline:
              sharding-column: id
              algorithm-expression: rule_${id % 2}
  1. 编写实体类和Mapper接口,示例代码如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Long id;
    private String name;
    private Integer age;
}

@Mapper
public interface UserMapper {
    @Insert("insert into user(id,name,age) values(#{id},#{name},#{age})")
    void insert(User user);

    @Select("select id,name,age from user where id = #{id}")
    User selectById(Long id);

    @Select("select id,name,age from user")
    List<User> selectAll();
}
  1. 编写测试类,测试主从库读写效果,示例代码如下:
@SpringBootTest
class ShardingJdbcApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        User user = User.builder().id(1L).name("User1").age(18).build();
        userMapper.insert(user);
    }

    @Test
    public void testSelectById() {
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

    @Test
    public void testSelectAll() {
        List<User> userList = userMapper.selectAll();
        System.out.println(userList);
    }
}

这样我们就完成了分库分表和读写分离的实现,开发者可以根据自己的实际需求进行调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例 - Python技术站

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

相关文章

  • SpringBoot2自动装配原理解析

    Spring Boot 2 自动装配原理解析 在本文中,我们将深入了解 Spring Boot 2 中自动装配的原理。我们将介绍 Spring Boot 2 自动装配的基本概念、自动装配的实现原理以及如何自定义自动装配。 Spring Boot 2 自动装配的基本概念 Spring Boot 2 自动装配是指 Spring Boot 2 在启动时自动配置应用…

    Java 2023年5月15日
    00
  • java 线程详解及线程与进程的区别

    Java 线程详解及线程与进程的区别 线程和进程的概念 在操作系统中,进程可以被看作是一个执行中的程序,它所占用的内存空间中包含了代码,数据,和系统资源等等。而线程则是进程中的执行单元,进程中可以拥有多个线程。 线程与进程的两个最重要的区别如下: 一个进程可以有多个线程,各个线程可以并发执行 一个进程内的线程共享该进程所占用的资源 Java 线程的创建和启动…

    Java 2023年5月18日
    00
  • 基于javax.validation结合spring的最佳实践

    基于javax.validation结合Spring的最佳实践,主要是利用Spring框架提供的Validator和DataBinder接口以及javax.validation提供的注解和API对请求参数和数据模型进行合法性校验,来保证应用程序的数据输入和输出的正确性。 下面是基于Spring Boot的完整攻略: 1. 引入依赖 在pom.xml文件中引入…

    Java 2023年5月19日
    00
  • 对象的销毁过程包括哪些步骤?

    对象的销毁过程是指当一个对象不再被需要时,系统如何对其进行销毁和回收相关资源的过程。在Java中,所有对象都是由垃圾回收器自动进行垃圾回收和销毁的。 对象的销毁过程包括以下步骤: 及时调用对象的finalize()方法,释放占用的资源。finalize()方法是一个由垃圾回收器在销毁对象之前调用的方法,可以在该方法中释放占用的资源,例如关闭文件、释放内存等。…

    Java 2023年5月10日
    00
  • 最好的Java 反编译工具的使用对比分析

    最好的Java 反编译工具的使用对比分析 背景 Java 程序开发与运行过程中,难免会遇到需要对已有的 .class 文件进行反编译的情况。这时候,选择一款好用的反编译工具就显得至关重要。本文将介绍目前市面上较为知名的Java 反编译工具并进行对比分析,以帮助读者在实际工作中作出合理的选择。 Java 反编译工具 JD-GUI JD-GUI 是一款免费的Ja…

    Java 2023年5月26日
    00
  • 超漂亮的Bootstrap 富文本编辑器summernote

    下面是这个Bootstrap富文本编辑器summernote的完整攻略。 介绍 Summernote是一款基于Bootstrap的富文本编辑器,功能强大、轻量级、简单易用,支持文本、图片等多种格式的编辑,同时也有插件系统可供扩展。它支持Markdown语法,可在WYSIWYG和编码之间自由切换,也支持响应式布局和多种主题样式。 下载和安装 下载summern…

    Java 2023年6月15日
    00
  • Java多线程编程中使用DateFormat类

    在Java多线程编程中,DateFormat类是常用的日期格式化类。本篇攻略将详细讲解如何在多线程环境中正确使用DateFormat类。 为什么要使用DateFormat类 在Java编程中,处理日期时间是一个常见的需求。格式化Date对象为字符串、解析字符串为Date对象等都需要用到日期格式化类。DateFormat类是一种线程不安全的类,因为DateFo…

    Java 2023年5月18日
    00
  • Java对象类型的判断详解

    Java对象类型的判断详解 Java是一种强类型语言,程序中所有的变量都必须先声明它们的数据类型,包括原始数据类型和对象类型。在Java中,可以使用instanceof运算符对对象的类型进行判断。 使用instanceof运算符进行类型判断 instanceof运算符用于测试对象是否是指定类的实例,或者是指定类的子类的实例。它的语法如下: object in…

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