Sharding-JDBC實現Mysql讀寫分離項目演示

引言

如果是爲了優化大表做知識儲備,建議先看這篇文章: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章