引言
如果是爲了優化大表做知識儲備,建議先看這篇文章: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、測試
- 程序插入5條數據,主庫從庫都能顯示,證明主從複製成功;
- 主數據源關閉,程序可以執行讀操作,但是不能執行寫操作;
- 從數據源關閉,程序可以執行寫操作,但是不能執行讀操作。
綜上:Sharding-JDBC成功實現Mysql讀寫分離。
結束語
本篇實現了Sharding-JDBC對Mysql讀寫分離,下一篇:Sharding-JDBC實現Mysql分表項目演示
本篇源碼地址:https://gitee.com/fangguochao/SpringBoot-Sharding-JDBC