引言
本篇文章是基于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、测试
- 程序插入5条数据,主库从库都能显示,证明主从复制成功;
- 主数据源关闭,程序可以执行读操作,但是不能执行写操作;
- 从数据源关闭,程序可以执行写操作,但是不能执行读操作。
综上:Sharding-JDBC成功实现Mysql读写分离。
结束语
本篇实现了Sharding-JDBC对Mysql读写分离,下一篇,将实战演示Sharding-JDBC对Mysql分库+读写分离。
本篇源码地址:
https://gitee.com/fangguochao/SpringBoot-Sharding-JDBC