Spring BootはSharding-JDBCで読み書きして分離します.
17003 ワード
本文はSpring BootがSharding-JDBCを使って読み書き分離することを紹介します.
1.Sharding-JDBCについて
本文はやはりネットのSharding-Jdbcの依存に基づいて、前の篇とSharding-Jdbcを使って分庫を分けて表の依存を表して一致して、しかも本文の大まかな内容は前の文章と似ています.先に私のもう一つの編を見てみることを提案します.
ここで特別な紹介が必要なのは、Sharding-JDBCを使って読み書き分離を行う場合、メインライブラリを一つしか設置できません.ライブラリから複数設定できます.アクセスポリシーはソースから見れば、二つのポーリングとランダムだけです.
ソースコードは以下の通りです
ローカル環境ではMysqlを使用していないので、メインライブラリとしてdatabase 0、database 1、database 2を作成しました.メインライブラリは添削操作を行い、ライブラリから照会操作を行います.下の図は本文データベースの三つの表です.
上の図はそれぞれ3つのデータベースの中のuser表であり、ここでmater-userはdatabase 0データベースの中のuser表であり、salve-user 1はdatabase 1のuser表であり、salve-user 2はdatabase 2のuser表である.
3.コード実現
本文はSpring Boot 2.0.3を使って、SprigData-JPA、Druidは池をつないで、と質素なsharrding-jdbc.
3.1建設表SQL
テーブルとデータベースを作成するSQLは以下の通りです.ここではデフォルトではライブラリ内にそれぞれデータを挿入しています.name値はそれぞれdalaoyang 1とdalaoyang 2を保存します.
新規プロジェクトは、ファイルに依存しますか?それともシャルディング-jdbc-core依存とdruid接続プールに依存しますか?完全なpomファイルコードは以下の通りです.
構成情報には、3つのデータベースの情報とJPAの簡単な構成が配置されている.
前の記事では、起動クラスに@EnbaleAutoConfigrationを入れてデータベースの自動配置を削除したと言っていましたが、その時はあまり注意していませんでした.実は@Spring Bootappration注解に直接データベースの自動配置を削除して、残りは前のページと同じです.@EnbaleTransaction Managementを使って事務を開始して、@EnfigConfiglation Propertiesを使って、構成エンティティに注釈を入れてください.起動クラスの完全コードは以下の通りです.
Userエンティティクラス
データベース配置クラス、Database 0 Config.
DataSourceConfigクラスを作成して読み書き分離を設定します.ここも実は分庫分表と似ています.分庫分表をもとに読み書き分離を行うこともできます.Map集合を作成して、ライブラリを受信します.データソースを作成するには、5つのパラメータが必要です.それぞれ: name:データソース名 マスタData SourceName:マスタデータベースデータソース名 マスターDataSource:主データソース slaaveData SourceMap:データソースセットから strate gyType:アクセスポリシー もちろん、他の方法を使ってデータソースを作成することもできます.このコードは以下の通りです.
Controllerはテストクラスとして、二つの方法を作成します.save方法とgetAll方法. save方法は、メインライブラリの挿入と修正をテストするために使用される . get All方法は、リードデータをテストするためのものである .
UserController類は以下の通りです.
4.1試験マスタ
postmanを使ってアクセスするhttp://localhost:8080/saveを選択します.
再び訪問します.
メインキーが衝突しました.実はこれは挿入時に使ったdatabase 0ですが、検索にはdatabase 1とdatabase 2が使われています.しかし、私はデータベース内にIDが100のデータがないので、JPAは挿入と判定しましたが、データベース内にはこのようなデータが欠けています.
これから照会をテストします.アクセスhttp://localhost:8080/getAll
再び訪問します.
ライブラリからの読み取りが正常であることを証明し、次にライブラリからのIDを100に修正します.そしてアクセスhttp://localhost:8080/saveを選択します.
IDが100のデータが存在するので、SQLは修正文です.
5.ソースコード
ソースアドレス:gitee.com/dalaoyang/s…
1.Sharding-JDBCについて
本文はやはりネットのSharding-Jdbcの依存に基づいて、前の篇とSharding-Jdbcを使って分庫を分けて表の依存を表して一致して、しかも本文の大まかな内容は前の文章と似ています.先に私のもう一つの編を見てみることを提案します.
ここで特別な紹介が必要なのは、Sharding-JDBCを使って読み書き分離を行う場合、メインライブラリを一つしか設置できません.ライブラリから複数設定できます.アクセスポリシーはソースから見れば、二つのポーリングとランダムだけです.
ソースコードは以下の通りです
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;
}
}
2.本文の場面ローカル環境ではMysqlを使用していないので、メインライブラリとしてdatabase 0、database 1、database 2を作成しました.メインライブラリは添削操作を行い、ライブラリから照会操作を行います.下の図は本文データベースの三つの表です.
上の図はそれぞれ3つのデータベースの中のuser表であり、ここでmater-userはdatabase 0データベースの中のuser表であり、salve-user 1はdatabase 1のuser表であり、salve-user 2はdatabase 2のuser表である.
3.コード実現
本文はSpring Boot 2.0.3を使って、SprigData-JPA、Druidは池をつないで、と質素なsharrding-jdbc.
3.1建設表SQL
テーブルとデータベースを作成するSQLは以下の通りです.ここではデフォルトではライブラリ内にそれぞれデータを挿入しています.name値はそれぞれdalaoyang 1とdalaoyang 2を保存します.
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依存ファイル新規プロジェクトは、ファイルに依存しますか?それともシャルディング-jdbc-core依存とdruid接続プールに依存しますか?完全なpomファイルコードは以下の通りです.
"1.0" encoding="UTF-8"?>
"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">
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.0.3.RELEASE
com.dalaoyang
springboot2_shardingjdbc_dxfl
0.0.1-SNAPSHOT
springboot2_shardingjdbc_dxfl
springboot2_shardingjdbc_dxfl
1.8
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
true
com.alibaba
druid
1.1.9
com.dangdang
sharding-jdbc-core
1.5.4
org.springframework.boot
spring-boot-maven-plugin
3.3配置情報構成情報には、3つのデータベースの情報とJPAの簡単な構成が配置されている.
##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起動クラス前の記事では、起動クラスに@EnbaleAutoConfigrationを入れてデータベースの自動配置を削除したと言っていましたが、その時はあまり注意していませんでした.実は@Spring Bootappration注解に直接データベースの自動配置を削除して、残りは前のページと同じです.@EnbaleTransaction Managementを使って事務を開始して、@EnfigConfiglation Propertiesを使って、構成エンティティに注釈を入れてください.起動クラスの完全コードは以下の通りです.
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エンティティクラス
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;
}
UserRepository類.package com.dalaoyang.repository;
import com.dalaoyang.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository {
}
3.6データベースパラメータクラスデータベース配置クラス、Database 0 Config.
package com.dalaoyang.database;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
/**
* @author yangyang
* @date 2019/1/30
*/
@Data
@ConfigurationProperties(prefix = "database0")
@Component
public class Database0Config {
private String url;
private String username;
private String password;
private String driverClassName;
private String databaseName;
public DataSource createDataSource() {
DruidDataSource result = new DruidDataSource();
result.setDriverClassName(getDriverClassName());
result.setUrl(getUrl());
result.setUsername(getUsername());
result.setPassword(getPassword());
return result;
}
}
データベース配置クラス、Database 1 Config.package com.dalaoyang.database;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
/**
* @author yangyang
* @date 2019/1/30
*/
@Data
@ConfigurationProperties(prefix = "database1")
@Component
public class Database1Config {
private String url;
private String username;
private String password;
private String driverClassName;
private String databaseName;
public DataSource createDataSource() {
DruidDataSource result = new DruidDataSource();
result.setDriverClassName(getDriverClassName());
result.setUrl(getUrl());
result.setUsername(getUsername());
result.setPassword(getPassword());
return result;
}
}
データベースの配置クラス、Database 2ちゃんねるfig.package com.dalaoyang.database;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
/**
* @author yangyang
* @date 2019/1/30
*/
@Data
@ConfigurationProperties(prefix = "database2")
@Component
public class Database2Config {
private String url;
private String username;
private String password;
private String driverClassName;
private String databaseName;
public DataSource createDataSource() {
DruidDataSource result = new DruidDataSource();
result.setDriverClassName(getDriverClassName());
result.setUrl(getUrl());
result.setUsername(getUsername());
result.setPassword(getPassword());
return result;
}
}
3.7読み書き分離の設定DataSourceConfigクラスを作成して読み書き分離を設定します.ここも実は分庫分表と似ています.分庫分表をもとに読み書き分離を行うこともできます.Map集合を作成して、ライブラリを受信します.データソースを作成するには、5つのパラメータが必要です.それぞれ:
package com.dalaoyang.database;
import com.dangdang.ddframe.rdb.sharding.api.MasterSlaveDataSourceFactory;
import com.dangdang.ddframe.rdb.sharding.api.strategy.slave.MasterSlaveLoadBalanceStrategyType;
import com.dangdang.ddframe.rdb.sharding.keygen.DefaultKeyGenerator;
import com.dangdang.ddframe.rdb.sharding.keygen.KeyGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* @author yangyang
* @date 2019/1/29
*/
@Configuration
public class DataSourceConfig {
@Autowired
private Database0Config database0Config;
@Autowired
private Database1Config database1Config;
@Autowired
private Database2Config database2Config;
@Bean
public DataSource getDataSource() throws SQLException {
return buildDataSource();
}
private DataSource buildDataSource() throws SQLException {
//
Map slaveDataSourceMap = new HashMap<>();
slaveDataSourceMap.put(database1Config.getDatabaseName(), database1Config.createDataSource());
slaveDataSourceMap.put(database2Config.getDatabaseName(), database2Config.createDataSource());
//
DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource("masterSlave",database0Config.getDatabaseName()
,database0Config.createDataSource(), slaveDataSourceMap, MasterSlaveLoadBalanceStrategyType.getDefaultStrategyType());
return dataSource;
}
@Bean
public KeyGenerator keyGenerator() {
return new DefaultKeyGenerator();
}
}
3.8 ControllerControllerはテストクラスとして、二つの方法を作成します.save方法とgetAll方法.
UserController類は以下の通りです.
package com.dalaoyang.controller;
import com.dalaoyang.entity.User;
import com.dalaoyang.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("save")
public void save(){
User user = new User();
user.setId(100L);
user.setName("dalaoyang");
user.setCity("beijing");
userRepository.save(user);
}
@GetMapping("getAll")
public Object getAll(){
return userRepository.findAll();
}
}
4.テスト4.1試験マスタ
postmanを使ってアクセスするhttp://localhost:8080/saveを選択します.
再び訪問します.
メインキーが衝突しました.実はこれは挿入時に使ったdatabase 0ですが、検索にはdatabase 1とdatabase 2が使われています.しかし、私はデータベース内にIDが100のデータがないので、JPAは挿入と判定しましたが、データベース内にはこのようなデータが欠けています.
これから照会をテストします.アクセスhttp://localhost:8080/getAll
再び訪問します.
ライブラリからの読み取りが正常であることを証明し、次にライブラリからのIDを100に修正します.そしてアクセスhttp://localhost:8080/saveを選択します.
IDが100のデータが存在するので、SQLは修正文です.
5.ソースコード
ソースアドレス:gitee.com/dalaoyang/s…