SpringBoot使用Sharding-JDBC讀寫分離

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


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

一.有關Sharding-JDBC



本文仍是基於噹噹網Sharding-Jdbc的依賴,與上一篇使用Sharding-Jdbc進行分庫分表依賴一致,而且本文大體內容與上一篇文章類似,建議先查看個人另外一篇在查看這篇會簡單許多,傳送門:
SpringBoot使用Sharding-JDBC分庫分表:https://www.dalaoyang.cn/article/95?spm=a2c4e.11153940.blogcont690021.12.a232195fabQVro
這裏須要特殊介紹的是,使用Sharding-JDBC進行讀寫分離的時候,只容許設置一個主庫,從庫的話能夠設置多個,訪問策略的話從源碼上看只有兩種輪詢(ROUND_ROBIN)和隨機(RANDOM)。
源碼代碼以下:
[Java]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.dangdang.ddframe.rdb.sharding.api.strategy.slave;
public enum MasterSlaveLoadBalanceStrategyType {
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;
}
}

二.本文場景
因爲本地環境並無使用Mysql主從複製,只是建立了三個庫,其中database0做爲主庫,database1和database2做爲從庫。主庫進行增刪改操做,從庫進行查詢操做,以下圖爲本文數據庫的三個表。
如上圖分別是三個數據庫中的user表,其中master-user爲database0數據庫中的user表,salve-user1爲database1中的user表,salve-user2爲database2中的user表。

三.代碼實現
本文使用SpringBoot2.0.3,SpringData-JPA,Druid鏈接池,和噹噹的sharding-jdbc。
3.1 建表SQL
建立表和數據庫的SQL以下所示,這裏默認在從庫內分別插入了一條數據,name值分別存放dalaoyang1和dalaoyang2便於區分。
[Java]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<? 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]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
##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]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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]
純文本查看
複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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爲修改語句。

做者簡介:小黑哎代碼,一個有故事的程序員。但願用文字,讓你讀懂代碼世界。微信號gzitcast,歡迎你們找我獲取各類資源。
java

相關文章
相關標籤/搜索