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中,可以利用数据库客户端进行查询,观察数据是否插入到正确的库和表中。

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

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

相关文章

  • Java多文件生成并压缩下载功能(思路详解)

    我们来详细的讲解一下“Java多文件生成并压缩下载功能(思路详解)”: 简介 本文讲述的是在Java Web应用中实现多文件生成并压缩下载功能的实现方法,主要的思路是将文件依次读取到内存中,然后利用Java ZipOutputStream类进行压缩,最后将生成的压缩文件发送给客户端。 步骤 第一步:获取文件列表 我们可以通过前端传递一个数组,数组中包含要下载…

    Java 2023年5月20日
    00
  • Nginx配合Apache或Tomcat的动静分离基本配置实例

    下面我来详细讲解一下“Nginx配合Apache或Tomcat的动静分离基本配置实例”。 1. 动静分离的概念 动静分离是将访问量比较大的动态资源和访问量比较小的静态资源分开处理,提高网站服务的性能和访问速度,同时减轻服务器的压力。 2. Nginx与Apache或Tomcat结合实现动静分离的基本原理 Nginx作为反向代理服务器,用来处理静态资源的请求,…

    Java 2023年6月15日
    00
  • Java别说取余(%)运算简单你真的会吗

    Java别说取余(%)运算简单你真的会吗? 什么是取余(%)运算? 在Java中,取余运算是用百分号(%)表示的运算符,用来计算两个数字的余数。 例如,12 % 5 的结果为2,因为12可以被5整除2次,剩下2。 取余运算可能出现的问题 在进行取余运算时,有时会出现我们意想不到的结果。这是因为在不同的情况下,取余运算所得到的余数可能不尽如人意。 负数取余的问…

    Java 2023年5月26日
    00
  • ELK收集Tomcat日志的实现

    下面我将为您详细讲解”ELK收集Tomcat日志的实现”。 什么是ELK? ELK是指Elasticsearch、Logstash、Kibana三个开源工具的集合,它们可以协同工作来收集、存储、搜索和可视化各种类型的日志数据。 Elasticsearch:全文搜索引擎,用于快速检索和存储数据。 Logstash:日志收集和转换工具,用于统一日志格式、进行过滤…

    Java 2023年6月2日
    00
  • Spring @Bean vs @Service注解区别

    下面是关于Spring中@Bean和@Service注解的详细讲解。 1. @Bean注解 1.1 概述 @Bean注解是用来注册一个Java Bean对象的,它是放在方法上的注解。当Spring的容器启动时,会去扫描所有带有这个注解的方法并执行它,最终返回的对象会被放到Spring的容器中。 1.2 示例说明 假设有一个用户服务的实现类UserServic…

    Java 2023年5月31日
    00
  • Java多线程常见案例分析线程池与单例模式及阻塞队列

    Java多线程常见案例分析线程池与单例模式及阻塞队列攻略 什么是多线程? 在计算机科学中,多线程(英语:Multithreading)指的是同时运行多个线程执行不同的任务。在线程中,单个处理器(或核心)会执行多个并发执行的任务。这是在现代操作系统中实现并发的一种方式。 什么是线程池? 线程池是预先实例化一定数量的线程,并在它们启动时将它们放入池中。每个任务都…

    Java 2023年5月19日
    00
  • Java之Pattern.compile函数用法详解

    Java之Pattern.compile函数用法详解 什么是Pattern.compile函数 Pattern.compile是Java正则表达式中的一个方法,可以用来编译正则表达式并生成一个Pattern对象。该对象可以被用于创建Matcher对象,以执行匹配操作。 Pattern.compile函数的语法 下面是Pattern.compile函数的语法:…

    Java 2023年5月26日
    00
  • Java中的Object类用法总结

    Java中的Object类用法总结 在Java中,每个类都是Object类的子类,因此Object类提供了一些通用方法可以用于任何对象,本文将总结Object类的用法。 Object类中的常用方法 equals() equals()方法用于比较两个对象的值是否相等,但需要注意的是,==运算符比较的是两个对象的引用是否相等,而不是值。 示例: String s…

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