Sharding-JDBC搭建MySQL读写分离

举报
海风极客 发表于 2022/10/16 19:11:56 2022/10/16
【摘要】 官网:https://shardingsphere.apache.org/document/5.0.0/cn 1 读写分离概述读写分离,顾名思义就是将Java应用对数据库的读和写操作进行区分执行,可以是在不同的数据节点也可能是在不同的数据库,这是在业务压力较大的情况下对数据库能够更好的承受压力的常用做法。 2 Spring Boot整合Sharding-JDBC实现读写分离 2.1 项目结构...

官网:https://shardingsphere.apache.org/document/5.0.0/cn

1 读写分离概述

读写分离,顾名思义就是将Java应用对数据库的读和写操作进行区分执行,可以是在不同的数据节点也可能是在不同的数据库,这是在业务压力较大的情况下对数据库能够更好的承受压力的常用做法。

在这里插入图片描述

2 Spring Boot整合Sharding-JDBC实现读写分离

2.1 项目结构和表结构

在这里插入图片描述

CREATE TABLE `student` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `age` int(2) DEFAULT NULL,
  `address` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=781 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT;

2.2 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- sharding-jdbc-->
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>3.0.0.M3</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2.3 配置文件

#允许将bean进行重写,如果没有该配置则可能会出现类似于bean冲突的异常
spring.main.allow-bean-definition-overriding=true
#主从数据库命名
sharding.jdbc.datasource.names=db-master-1,db-slave-1
#主数据源-写操作
sharding.jdbc.datasource.db-master-1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.db-master-1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.db-master-1.url=jdbc:mysql://127.0.0.1:3306/test
sharding.jdbc.datasource.db-master-1.username=root
sharding.jdbc.datasource.db-master-1.password=12345
#从数据源-读操作
sharding.jdbc.datasource.db-slave-1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.db-slave-1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.db-slave-1.url=jdbc:mysql://127.0.0.1:3307/test
sharding.jdbc.datasource.db-slave-1.username=root
sharding.jdbc.datasource.db-slave-1.password=12345
# 读写分离配置 算法:round_robin(轮询)和random(随机)
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=dataSource
sharding.jdbc.config.masterslave.master-data-source-name=db-master-1
sharding.jdbc.config.masterslave.slave-data-source-names=db-slave-1

2.4 代码

StudentMapper.java

/**
 * @desc: Mapper层接口
 * @author: YanMingXin
 * @create: 2021/11/27-17:03
 **/
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}

Student.java

/**
 * @desc: 实体类
 * @author: YanMingXin
 * @create: 2021/11/27-17:01
 **/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class Student {

    private Integer id;

    private String name;

    private Integer age;

    private String address;

}

StudentService.java

/**
 * @desc: 接口
 * @author: YanMingXin
 * @create: 2021/11/27-17:03
 **/
public interface StudentService {

    void saveStudent(Student student);

    Student findStudentById(Integer id);

    List<Student> findAllStudent();

}

StudentServiceImpl.java

/**
 * @desc: 接口实现类
 * @author: YanMingXin
 * @create: 2021/11/27-17:03
 **/
@Service
public class StudentServiceImpl implements StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Override
    public void saveStudent(Student student) {
        studentMapper.insert(student);
    }

    @Override
    public Student findStudentById(Integer id) {
        return studentMapper.selectById(id);
    }

    @Override
    public List<Student> findAllStudent() {
        return studentMapper.selectList(null);
    }
}

SpShardingjdbcApplicationTests.java

@SpringBootTest
class SpShardingjdbcApplicationTests {

    @Autowired
    private StudentService studentService;

    @Test
    void contextLoads() {
        studentService.saveStudent(new Student(1,"zs",12,"bj"));
    }

    @Test
    void selectStudent(){
        System.out.println(studentService.findStudentById(1));
        System.out.println(studentService.findStudentById(2));
    }
}

2.5 测试结果

先插入一条数据,然后手动将从库插入一条数据(因为本次实验的主从没有进行主从复制,也为了能演示出读写分离的效果)

主库:
在这里插入图片描述
从库:
在这里插入图片描述
进行查询:
在这里插入图片描述

3 读写分离原理

在这里插入图片描述
Sharding-jdbc实现Java对MySQL的读写分离核心点是代理,就是将应用对MySQL数据库的操作转化为对Sharding-jdbc的操作,再由Sharding-JDBC进行规则的定义和SQL操作的转发,按照开发人员自定义的规则进行SQL操作的解析、改写、路由和执行。

欢迎关注公众号

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。