SpringBoot整合Sharding-JDBC实现MySQL8读写分离

目录

  • 一.前言
  • 二.项目目录结构
  • 三.pom文件
  • 四.配置文件(基于YAML)及SQL建表语句
  • 五.Mapper.xml文件及Mapper接口
  • 六 .Controller及Mocel文件
  • 七.结果
  • 八.Sharding-JDBC不同版本上的配置

一.前言 这是一个基于SpringBoot整合Sharding-JDBC实现读写分离的极简教程,笔者使用到的技术及版本如下:
  • SpringBoot 2.5.2
  • MyBatis-Plus 3.4.3
  • Sharding-JDBC 4.1.1
  • MySQL8集群(看笔者前一篇文章有部署教程)

二.项目目录结构 SpringBoot整合Sharding-JDBC实现MySQL8读写分离
文章图片


三.pom文件
4.0.0org.springframework.bootspring-boot-starter-parent2.5.2 xyz.hcworldsharding-jdbc-demo0.0.1-SNAPSHOTsharding-jdbc-demo多数据源切换实例1.8org.springframework.bootspring-boot-starter-webcom.baomidoumybatis-plus-boot-starter3.4.3mysqlmysql-connector-javaruntimeorg.apache.shardingspheresharding-jdbc-spring-boot-starter4.1.1org.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-pluginorg.projectlomboklombok


四.配置文件(基于YAML)及SQL建表语句
spring:main:allow-bean-definition-overriding: true#显示sqlshardingsphere:props:sql:show: truemasterslave:#配置主从名称name: ms#置主库master,负责数据的写入master-data-source-name: ds1#配置从库slave节点slave-data-source-names: ds2,ds3#配置slave节点的负载均衡均衡策略,采用轮询机制,有两种算法:round_robin(轮询)和random(随机)load-balance-algorithm-type: round_robinsharding:#配置默认数据源ds1 默认数据源,主要用于写default-data-source-name: ds1# 配置数据源datasource:names: ds1,ds2,ds3#master-ds1数据库连接信息ds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://192.168.2.142:3307/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456maxPoolSize: 100minPoolSize: 5#slave-ds2数据库连接信息ds2:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://192.168.2.142:3308/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456maxPoolSize: 100minPoolSize: 5#slave-ds3数据库连接信息ds3:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://192.168.2.142:3309/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456maxPoolSize: 100minPoolSize: 5#mybatis-plus配置mybatis-plus:type-aliases-package: xyz.hcworld.demo.modelmapper-locations: classpath*:/mapper/**Mapper.xml

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`nickname` varchar(100) DEFAULT NULL,`password` varchar(100) DEFAULT NULL,`sex` int(11) DEFAULT NULL,`birthday` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;


五.Mapper.xml文件及Mapper接口
INSERT INTO t_user(nickname,PASSWORD,sex,birthday) VALUES(#{nickname},#{password},#{sex},#{birthday})SELECTid,nickname,PASSWORD,sex,birthdayFROM t_user;

package xyz.hcworld.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.springframework.stereotype.Component; import xyz.hcworld.demo.model.User; import java.util.List; /** * @ClassName: UserMapper * @Author: 张红尘 * @Date: 2021-07-20 * @Version: 1.0 */@Componentpublic interface UserMapperextends BaseMapper {void addUser(User user); List findUsers(); }


六 .Controller及Mocel文件
package xyz.hcworld.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import xyz.hcworld.demo.mapper.UserMapper; import xyz.hcworld.demo.model.User; import java.security.SecureRandom; import java.util.List; /** * @ClassName: UserController * @Author: 张红尘 * @Date: 2021-07-20 * @Version: 1.0 */@RestController@RequestMapping("/api/user")public class UserController {@Autowiredprivate UserMapper userMapper; @PostMapping("/save")public String addUser() {User user = new User(); user.setNickname("zhangsan" + new SecureRandom().nextInt()); user.setPassword("123456"); user.setSex(1); user.setBirthday("1997-12-03"); userMapper.addUser(user); return user.toString(); }@GetMapping("/findUsers")public List findUsers() {return userMapper.findUsers(); }}

package xyz.hcworld.demo.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; /** * @ClassName: User * @Author: 张红尘 * @Date: 2021-07-20 * @Version: 1.0 */@Data@TableName("t_user")public class User {private static final long serialVersionUID = 1L; @TableId(value = "https://www.it610.com/article/id", type = IdType.AUTO)private Integer id; private String nickname; private String password; private Integer sex; private String birthday; }


七.结果 从结果可以看出,写入操作全部通过ds1数据库(master)数据库完成,而读操作因为设置了轮询的缘故,由ds2(slaver)、ds3(slaver2)数据库完成。这样就实现了基于一主二从的数据库集群的读写分离操作。

SpringBoot整合Sharding-JDBC实现MySQL8读写分离
文章图片


八.Sharding-JDBC不同版本上的配置 网上Sharding-JDBC的教程多为4.0.0.RC1版本,笔者使用的是最新的4.1.1所以
在该部分数据库地址在4.1.1为jdbc-url在4.0.0.RC1上需要改为url否则会启动失败
jdbc-url: jdbc:mysql://XXXX/XXXX

且网上教程多为properties文件,笔者将其转变为YAML文件更加能直观感受
项目下载
GitHub:https://github.com/z875479694h/sharding-jdbc-demo
【SpringBoot整合Sharding-JDBC实现MySQL8读写分离】到此这篇关于SpringBoot整合Sharding-JDBC实现MySQL8读写分离的文章就介绍到这了,更多相关SpringBoot Sharding-JDBC MySQL8读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读