SpringBoot使用Sharding-JDBC讀寫分離

SpringBoot使用Sharding-JDBC讀寫分離java

摘要: 本文介紹SpringBoot使用噹噹Sharding-JDBC進行讀寫分離。 1.有關Sharding-JDBC 本文仍是基於噹噹網Sharding-Jdbc的依賴,與上一篇使用Sharding-Jdbc進行分庫分表依賴一致,而且本文大體內容與上一篇文章類似,建議先查看個人另外一篇在查看這篇會簡單許多,傳送門《SpringBoot使用Sharding-JDBC分庫分表》。mysql

本文介紹SpringBoot使用噹噹Sharding-JDBC進行讀寫分離。web

一.有關Sharding-JDBCspring

本文仍是基於噹噹網Sharding-Jdbc的依賴,與上一篇使用Sharding-Jdbc進行分庫分表依賴一致,而且本文大體內容與上一篇文章類似,建議先查看個人另外一篇在查看這篇會簡單許多,傳送門:

SpringBoot使用Sharding-JDBC分庫分表:https://www.dalaoyang.cn/arti...
這裏須要特殊介紹的是,使用Sharding-JDBC進行讀寫分離的時候,只容許設置一個主庫,從庫的話能夠設置多個,訪問策略的話從源碼上看只有兩種輪詢(ROUND_ROBIN)和隨機(RANDOM)。
源碼代碼以下:
[Java] 純文本查看 複製代碼
?sql

package com.dangdang.ddframe.rdb.sharding.api.strategy.slave;數據庫

public enum MasterSlaveLoadBalanceStrategyType {apache

ROUND_ROBIN(new RoundRobinMasterSlaveLoadBalanceStrategy()),
RANDOM(new RandomMasterSlaveLoadBalanceStrategy());

private final MasterSlaveLoadBalanceStrategy strategy;

public static MasterSlaveLoadBalanceStrategyType getDefaultStrategyType() {
    return ROUND_ROBIN;
}

private MasterSlaveLoadBalanceStrategyType(MasterSlaveLoadBalanceStrategy strategy) {
    this.strategy = strategy;
}

public MasterSlaveLoadBalanceStrategy getStrategy() {
    return this.strategy;
}

}api

二.本文場景springboot

因爲本地環境並無使用Mysql主從複製,只是建立了三個庫,其中database0做爲主庫,database1和database2做爲從庫。主庫進行增刪改操做,從庫進行查詢操做,以下圖爲本文數據庫的三個表。

如上圖分別是三個數據庫中的user表,其中master-user爲database0數據庫中的user表,salve-user1爲database1中的user表,salve-user2爲database2中的user表。dom

三.代碼實現

本文使用SpringBoot2.0.3,SpringData-JPA,Druid鏈接池,和噹噹的sharding-jdbc。

3.1 建表SQL

建立表和數據庫的SQL以下所示,這裏默認在從庫內分別插入了一條數據,name值分別存放dalaoyang1和dalaoyang2便於區分。

[Java] 純文本查看 複製代碼
?

CREATE DATABASE database0;
USE database0;
DROP TABLE IF EXISTS user;
CREATE TABLE user(

id bigint(64) not null,
city varchar(20) not null,
name varchar(20) not null,
PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE DATABASE database1;
USE database1;
DROP TABLE IF EXISTS user;
CREATE TABLE user(

id bigint(64) not null,
city varchar(20) not null,
name varchar(20) not null,
PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO database1.user(id, city, name) VALUES (101, 'beijing', 'dalaoyang1');

CREATE DATABASE database2;
USE database2;
DROP TABLE IF EXISTS user;
CREATE TABLE user(

id bigint(64) not null,
city varchar(20) not null,
name varchar(20) not null,
PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO database2.user(id, city, name) VALUES (102, 'beijing', 'dalaoyang2');

3.2 依賴文件

新建項目,依賴文件仍是噹噹的sharding-jdbc-core依賴和druid鏈接池,完整pom文件代碼以下所示。

[XML] 純文本查看 複製代碼
?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dalaoyang</groupId>
<artifactId>springboot2_shardingjdbc_dxfl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot2_shardingjdbc_dxfl</name>
<description>springboot2_shardingjdbc_dxfl</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.9</version>
    </dependency>
    <!-- sharding-jdbc -->
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>sharding-jdbc-core</artifactId>
        <version>1.5.4</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>

3.3 配置信息

在配置信息中配置了三個數據庫的信息和JPA的簡單配置。

[Java] 純文本查看 複製代碼
?

Jpa配置

spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

數據庫配置

數據庫database0地址

database0.url=jdbc:mysql://localhost:3306/database0?characterEncoding=utf8&useSSL=false

數據庫database0用戶名

database0.username=root

數據庫database0密碼

database0.password=root

數據庫database0驅動

database0.driverClassName=com.mysql.jdbc.Driver

數據庫database0名稱

database0.databaseName=database0

數據庫database1地址

database1.url=jdbc:mysql://localhost:3306/database1?characterEncoding=utf8&useSSL=false

數據庫database1用戶名

database1.username=root

數據庫database1密碼

database1.password=root

數據庫database1驅動

database1.driverClassName=com.mysql.jdbc.Driver

數據庫database1名稱

database1.databaseName=database1

數據庫database2地址

database2.url=jdbc:mysql://localhost:3306/database2?characterEncoding=utf8&useSSL=false

數據庫database1用戶名

database2.username=root

數據庫database1密碼

database2.password=root

數據庫database1驅動

database2.driverClassName=com.mysql.jdbc.Driver

數據庫database1名稱

database2.databaseName=database2
3.4 啓動類

上一篇文章說到在啓動類加入了@EnableAutoConfiguration去除數據庫自動配置,當時也沒太注意,其實能夠直接在@SpringBootApplication註解上去除數據庫自動配置,剩下的和上一篇同樣,使用@EnableTransactionManagement開啓事務,使用@EnableConfigurationProperties註解加入配置實體,啓動類完整代碼以下所示。

[Java] 純文本查看 複製代碼
?

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableTransactionManagement(proxyTargetClass = true)
@EnableConfigurationProperties
public class Springboot2ShardingjdbcDxflApplication {

public static void main(String[] args) {
    SpringApplication.run(Springboot2ShardingjdbcDxflApplication.class, args);
}

}

3.5 實體類和數據庫操做層
User實體類。
[Java] 純文本查看 複製代碼
?

package com.dalaoyang.entity;

import lombok.Data;

import javax.persistence.*;

@Entity
@Table(name="user")
@Data
public class User {

@Id
private Long id;

private String city;

private String name;

}

四.測試4.1 測試主庫
使用postman訪問http://localhost:8080/save,控制檯如圖所示。

再次訪問,如圖。

主鍵衝突了,其實這是因爲插入的時候使用的database0,可是查詢使用的是database1和database2,可是我在從庫內並無ID是100的數據,因此JPA斷定我爲插入,可是數據庫內缺有這樣的數據。
咱們接下來測試一下查詢。訪問http://localhost:8080/getAll

再次訪問,如圖。

證實從庫的讀取是正常的,接下來修改從庫的ID爲100。而後訪問http://localhost:8080/save,查看控制檯如圖。由於存在了ID爲100的數據,因此SQL爲修改語句。

相關文章
相關標籤/搜索