springboot整合shardingjdbc实现分库分表最简单demo

下面是一份完整的SpringBoot整合ShardingJDBC实现分库分表最简单demo的攻略:

一、前置条件

  1. 掌握SpringBoot和Maven的基础及配置方式;
  2. 了解什么是ShardingJDBC以及其分库分表的实现原理;
  3. 准备好使用的数据库及其账号密码。

二、添加依赖

在Maven的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>5.0.0-alpha</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>5.0.0-alpha</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>5.0.0-alpha</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

这些依赖用于引入ShardingJDBC及其SpringBoot集成包、MySQL驱动等。

三、配置ShardingJDBC

在SpringBoot的application.yml文件中添加以下配置:

spring:
  datasource:
    names: primary_ds, secondary_ds
    primary_ds:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/primary_db?serverTimezone=UTC&useSSL=false
      username: root
      password: root
    secondary_ds:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/secondary_db?serverTimezone=UTC&useSSL=false
      username: root
      password: root
  shardingsphere:
    datasource:
      names: ds
      ds:
        primary_ds:
          url: jdbc:mysql://localhost:3306/primary_ds?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
          username: root
          password: ***
        secondary_ds:
          url: jdbc:mysql://localhost:3306/secondary_ds?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
          username: root
          password: ***
    sharding:
      tables:
        user:
          actualDataNodes: ds.user_$->{0..1}
          tableStrategy:
            standard:
              shardingColumn: id
              shardingAlgorithmName: database_inline
          databaseStrategy:
            inline:
              shardingColumn: id
              shardingAlgorithmName: database_inline

以上配置为ShardingJDBC的分库表策略,分为两个数据源(primary_ds和secondary_ds),两个库(primary_db和secondary_db)和一个分表(user_id),其中:

  1. primary_db和secondary_db为两个逻辑库,对应两个数据源primary_ds和secondary_ds。

  2. id字段为分表字段,数据会根据该字段进行取模选择表。

  3. ds.user_$->{0..1} 表示user表共有2张表,分别为user_0和user_1。

四、编写Mapper

新建一个UserMapper接口,具体定义如下:

@Mapper
public interface UserMapper {

    @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})")
    int insert(User user);

    @Select("SELECT * FROM user")
    List<User> selectAll();
}

以上Mapper为基于MyBatis的注解Mapper,用于定义数据访问API,这里仅定义了插入和查询全部记录两个方法,其中User类为具体业务实体模型,可根据需求自定义。

五、编写Service

新建一个UserService接口,具体定义如下:

public interface UserService {

    int insert(User user);

    List<User> selectAll();
}

新建一个UserServiceImpl类,具体定义如下:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public int insert(User user) {
        return userMapper.insert(user);
    }

    @Override
    public List<User> selectAll() {
        return userMapper.selectAll();
    }
}

以上为基于Spring的Service层,用于定义业务逻辑,这里应用了ShardingJDBC的分库分表功能,可实现数据自动分库分表。

六、编写Controller

新建一个UserController类,具体定义如下:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/user")
    public String createUser(@RequestBody User user) {
        userService.insert(user);
        return "create user success";
    }

    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.selectAll();
    }
}

以上为基于SpringMVC的Controller层,用于定义HTTP接口,其中POST /user接口用于创建用户,GET /users接口用于查询全部用户记录。

七、启动项目

启动SpringBoot应用,可以使用Postman等HTTP客户端进行测试,访问http://localhost:8080/users接口可以获取全部用户记录。

示例一

为了验证ShardingJDBC支持分库分表,可以新建一个名为testdb的数据库,在其中创建两个表user_0和user_1,再进行测试:


USE testdb;

CREATE TABLE user_0 (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64),
  age INT
);

CREATE TABLE user_1 (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64),
  age INT
);

启动SpringBoot应用,此时ReplicaQueryTests进程中将自动创建表user_0和user_1。然后使用Postman等工具进行测试,访问http://localhost:8080/user接口进行创建用户,观察数据库的数据是否插入到正确的表中。

示例二

为了验证ShardingJDBC支持分库分表,可以将两个表放到不同的数据库中,然后进行测试:

spring:
  shardingsphere:
    datasource:
      names: ds
      ds:
        primary_ds:
          url: jdbc:mysql://localhost:3307/primary_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
          username: root
          password: ***
        secondary_ds:
          url: jdbc:mysql://localhost:3308/secondary_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
          username: root
          password: ***

将primary_db放到本地的3307端口,secondary_db放到本地的3308端口。

启动SpringBoot应用,此时ReplicaQueryTests进程中将自动创建表user_0和user_1,并将数据分别插入到primary_db和secondary_db的user_0和user_1中,可以利用数据库客户端进行查询,观察数据是否插入到正确的库和表中。

阅读剩余 78%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合shardingjdbc实现分库分表最简单demo - Python技术站

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

相关文章

  • 基于Java的Spring框架来操作FreeMarker模板的示例

    基于Java的Spring框架来操作 FreeMarker 模板是一种灵活高效的模板引擎模式。下面是详细的攻略: 1. 安装配置FreeMarker依赖 首先需要在项目中添加 FreeMarker 的 maven 依赖: <dependency> <groupId>org.freemarker</groupId> <…

    Java 2023年6月15日
    00
  • SpringBoot+jpa配置如何根据实体类自动创建表

    SpringBoot可以通过JPA(Java Persistence API)来进行数据库操作。在使用JPA时,我们可以让它自动创建数据表,而不需要手动创建。 下面是Spring Boot与JPA自动生成数据表的配置方法: 配置数据源 首先,在application.properties中配置数据源: spring.datasource.url=jdbc:m…

    Java 2023年5月20日
    00
  • SpringBoot Loki安装简介及实战思路

    SpringBoot Loki安装简介及实战思路 1. 简介 Loki是一个针对日志处理的系统,由于Prometheus不是专门用于处理日志的,在日志处理上的性能和扩展性受到限制,于是就有了Loki。Loki是Prometheus旗下的一个项目,使用Go语言编写,将日志收集器的工作委托给客户端工具,将日志转储到后端,并提供基于标签的存储、聚合、查询和告警系统…

    Java 2023年5月26日
    00
  • 纯javascript实现分页(两种方法)

    下面我将详细讲解“纯javascript实现分页(两种方法)”的完整攻略。 1. 分页的基本概念 在讲解具体实现方法前,我们先来了解一下分页的基本概念。分页是一种常见的数据展示方式,将大量数据分为若干页进行展示,避免一次性展示大量数据造成页面加载缓慢、卡顿等问题。常见的分页组件会显示页码、上一页、下一页等按钮,用户点击按钮即可进行翻页操作。 2. 方法一:手…

    Java 2023年6月15日
    00
  • Java NIO异步文件通道原理及用法解析

    Java NIO异步文件通道原理及用法解析 什么是Java NIO Java NIO(New IO)是一个针对Java 1.4及以上版本的IO API,用于提供替代传统Java IO API中比较耗时的阻塞式IO操作。与旧的IO API相比,它使Java的IO操作变得更快、更可扩展和更多功能。 Java NIO核心组件包括:选择器、ByteBuffer、Ch…

    Java 2023年5月20日
    00
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

    Java 2023年5月31日
    00
  • 详解IDEA自定义注释模板(javadoc)

    下面是详细讲解”详解IDEA自定义注释模板(javadoc)”的攻略,包含以下内容: 1. 什么是Javadoc注释? Javadoc注释是Java中常用的一种标准注释格式,用来对类、属性、方法等进行说明,通常以/*开头,以/结尾。 使用Javadoc注释可以方便地生成API文档,并且使得代码更加易读、易维护。 2. IDEA中如何自定义Javadoc注释模…

    Java 2023年5月26日
    00
  • 面试官:详细谈谈Java对象的4种引用方式

    下面我会详细讲解Java对象的4种引用方式: 一、强引用 (Strong Reference) 强引用是Java中最普通、默认的引用方式,当一个对象被强引用变量引用时,垃圾回收器无法自动对其进行回收。只有在该对象的所有强引用变量被释放后,垃圾回收器才会回收该对象并释放其占用的内存空间。 示例代码: Object obj = new Object(); // …

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