Sharding-JDBC实现Mysql读写分离实战演示

引言

本篇文章是基于SpringBoot+Mysql+Mybatis+Sharding-JDBC实现Mysql的读写分离,数据库是一主一从,如果对数据库主从复制搭建还不清楚的,可以看博主这篇文章:Linux下搭建Mysql主从复制详解

1、Sharding-JDBC简介

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

2、Sharding-JDBC架构图

在这里插入图片描述
上图可以看出:数据源完全由Sharding-JDBC托管,写操作执行master库,读操作执行slave库,不需要程序员在程序中关注这个实现了。

3、本地实现

3.1、数据源准备

虚拟机 ip mysql版本 主从关系
192.168.158.129 5.7.30 master
192.168.158.131 5.7.30 slave

3.2、初始化数据脚本

USE `coolsummermoon`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(18) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

3.3、构建SpringBoot项目

在这里插入图片描述

3.4、pom.xml

//下面要特别注意springboot的版本不能是最新的,否则启动会报jar报冲突的错误!!!
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.3.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>1.3.2</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid-spring-boot-starter</artifactId>
		<version>1.1.22</version>
	</dependency>
	<dependency>
		<groupId>io.shardingsphere</groupId>
		<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
		<version>3.1.0</version>
	</dependency>
</dependencies>

3.5、application.yml

sharding:
  jdbc:
    datasource:
      # 配置数据源,多个用逗号分隔
      names: db-master,db-slave
      db-master:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.158.129:3306/coolsummermoon?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
      db-slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.158.131:3306/coolsummermoon?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: 123456
        maxPoolSize: 20
    config:
      # 配置主从信息
      masterslave:
      	# 配置负载均衡
        load-balance-algorithm-type: round_robin
        name: db1s1
        # 配置主数据源,多个用逗号分隔
        master-data-source-name: db-master
        # 配置从数据源,多个用逗号分隔
        slave-data-source-names: db-slave
    props:
      sql:
      	# 打印sql信息
        show: true
server:
  port: 8010
mybatis:
  type-aliases-package: com.comcoolsummermoon.entity
  mapper-locations: classpath:mapper/*.xml

3.6、controller

@RestController
@RequestMapping("users")
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/list")
    public Object list() {
        return userService.list();
    }
    
    @GetMapping("/insert")
    public Object insert(@RequestParam String username, @RequestParam String  password) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        return userService.insert(user);
    }
}

4、测试

  1. 程序插入5条数据,主库从库都能显示,证明主从复制成功;
  2. 主数据源关闭,程序可以执行读操作,但是不能执行写操作;
  3. 从数据源关闭,程序可以执行写操作,但是不能执行读操作。

综上:Sharding-JDBC成功实现Mysql读写分离。

结束语

本篇实现了Sharding-JDBC对Mysql读写分离,下一篇,将实战演示Sharding-JDBC对Mysql分库+读写分离。
本篇源码地址
https://gitee.com/fangguochao/SpringBoot-Sharding-JDBC

猜你喜欢

转载自blog.csdn.net/cool_summer_moon/article/details/106320721
今日推荐