# Sharding-JDBC从入门到精通(8)- 综合案例(一)数据库设计搭建与分片策略配置

Sharding-JDBC从入门到精通(8)- 综合案例(一)数据库设计搭建与分片策略配置

一、Sharding-JDBC 综合案例-数据库设计

1、案例 需求描述:本案例实现功能如下:

  • 1、添加商品
  • 2、商品分页查询
  • 3、商品统计

2、数据库设计

1)数据库设计如下,其中商品与店铺信息之间进行了垂直分库,分为了 PRODUCT DB(商品库) 和 STORE DB(店铺库);商品信息还进行了垂直分表,分为了商品基本信息 (product _info) 和商品描述信息 (product_descript),地理区域信息 (region) 作为公共表,冗余在两库中。

数据库设计.png

2)考虑到商品信息的数据增长性,对PRODUCT_DB(商品库)进行了水平分库,分片键使用店铺id,分片策略为店铺 ID%2 +1,因此商品描述信息对所属店铺标识进行了几余。

3)对商品基本信息(产品信息)和商品描述信息(产品描述)进行水平分表,分片键使用商品标识,分片策略为商品标识%2+1,并将为这两个表设置为绑定表,避免笛卡尔积连接。

4)为避免主键冲突,ID 生成策略采用雪花算法来生成全局唯一 ID,最终数据库设计为下图

 最终数据库设计图.png

二、Sharding-JDBC 综合案例-主从数据库搭建

1、环境说明

  • 操作系统:Win10
  • 数据库:MySQL-5.7.25
  • JDK:64位jdk1.8.0 201
  • 应用框架:spring-boot-2.1.3.RELEASE,Mybatis3.5.0
  • Sharding-jDBC :sharding-jdbc-spring-boot-starter-4.0.0-RC1

2、环境准备

# 设置需要同步的数据库
binlog-do-db=store_db
binlog-do-db=product_db_1
binlog-do-db=product_db_2
2.1、mysql 主、从同步配置 (windows):新增 mysql 实例

1)复制原有 mysql (已经安装的),如: D:\mysql-5.7.25(作为主库) -> D:\mysql-5.7.25-s1(作为从库),

2)修改以下从库的 my.ini:

[mysq1d]
#设置3307端口
port =3307

# 设置mysql的安装目录
basedir=D:\mysql-5.7.25-s1

# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-5.7.25-s1\data

3)安装 mysql 服务:将从库安装为 windows 服务,注意配置文件位置:

D:\mysql-5.7.25-s1\bin>  mysqld install mysqls1 --defaults-file="D:\mysql-5.7.25-s1\my.ini"

4)由于从库是从主库复制过来的,因此里面的数据完全一致,可使用原来的账号、密码登录。

2.2、修改主、从库的配置文件(my.ini),新增内容如下:

1)主库配置 my.ini 文件。

[mysq1d]
#开启日志
log-bin = mysql-bin

#设置服务id,主从不能一致
server-id =1

#设置需要同步的数据库(不设置会同步所有数据库)
binlog-do-db=user_db
binlog-do-db=store_db
binlog-do-db=product_db_1
binlog-do-db=product_db_2

#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

2) 从库配置 my.ini 文件。

[mysq1d]
#开启日志
log-bin = mysql-bin

#设置服务id,主从不能一致
server-id =2

#设置需要同步的数据库
replicate_wild_do_table=user_db.%
replicate_wild_do_table=store_db.%
replicate_wild_do_table=product_db_1.%
replicate_wild_do_table=product_db_2.%

#屏蔽系统库同步
replicate_wild_ignore_table=mysq1.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
2.3、重启主库和从库:
net start[主库服务名]  如: net start mysql
net start [从库服务名mysqls1]  如: net start mysqls1

请注意,主从 MySQL 下的数据(data)目录下有个文件 auto.cnf,文件中定义了 uuid,要保证主从数据库实例的 uuid 不一样,建议直接删除掉,重启服务后将会重新生成。

2.4、授权主从复制专用账号
#切换至主库 bin 目录,登录主库
mysql -h localhost -u root -p

#授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';

#刷新权限
FLUSH PRIVILEGES;

#确认位点记录下文件名以及位点
show master status;
2.5、设置从库向主库同步数据、并检查链路
#切换至从库bin目录,登录从库
mysql -h localhost -P3307 -uroot-p

#先停止同步
STOP SLAVE;

#修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO
master_host = 'localhost',
master_user = 'db_sync',
master_password = 'db_sync',
master_log_file = 'mysql-bin.000002',
master_log_pos =154;

#启动同步
START SLAVE;

#查看从库状态Slave_IO_RuningSlave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后排查相关异常。

show slave status\G

#注意 如果之前此备库已有主库指向需要先执行以下命令清空
stop slave io_thread for channel '';
reset slave all;
2.6、请注意,主从 MySQL 下的数据(data)目录下有个文件 auto.cnf,文件中定义了 uuid,要保证主从数据库实例的 uuid 不一样,建议直接删除掉,重启服务后将会重新生成。

3、初始化数据库:创建 store_db, product_db_1, product_db_2 三个数据库,并执行以下脚本创建数据表 region, store_info 和插入数据。


# 创建数据库:store_db, product_db_1, product_db_2 三个数据库。

CREATE DATABASE `store_db` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE DATABASE `product_db_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE DATABASE `product_db_2` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

# 在 数据库 store_db, product_db_1, product_db_2 三个数据库 中,都创建表 store_db, 并插入数据。

# 在 数据库 store_db 中,创建表 region, 并插入数据。

USE `store_db`;

# 创建 region 表

DROP TABLE IF EXISTS `region`;

CREATE TABLE `region` (
`id` BIGINT(20) NOT NULL COMMENT 'id',
`region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域编码',
`region_name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域名称',
`level` TINYINT(1) NULL DEFAULT NULL COMMENT '地理区域级别(省、市、县)',
`parent_region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级地理区域编码',
PRIMARY KEY(`id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;


# 向 region 表中插入数据:

INSERT INTO `region` VALUES(1, '110000', '北京', 0, NULL);
INSERT INTO `region` VALUES(2, '410000', '河南', 0, NULL);
INSERT INTO `region` VALUES(3, '110100', '北京市', 1, 110000);
INSERT INTO `region` VALUES(4, '410100', '郑州市', 1, 410000);

# 在 数据库 product_db_1 中,创建表 region, 并插入数据。

USE `product_db_1`;

# 创建  region 表

DROP TABLE IF EXISTS `region`;

CREATE TABLE `region` (
`id` BIGINT(20) NOT NULL COMMENT 'id',
`region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域编码',
`region_name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域名称',
`level` TINYINT(1) NULL DEFAULT NULL COMMENT '地理区域级别(省、市、县)',
`parent_region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级地理区域编码',
PRIMARY KEY(`id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;


# 向 region 表中插入数据:

INSERT INTO `region` VALUES(1, '110000', '北京', 0, NULL);
INSERT INTO `region` VALUES(2, '410000', '河南', 0, NULL);
INSERT INTO `region` VALUES(3, '110100', '北京市', 1, 110000);
INSERT INTO `region` VALUES(4, '410100', '郑州市', 1, 410000);

# 在 数据库 product_db_2 中,创建表 region, 并插入数据。

USE `product_db_2`;

# 创建  region 表

DROP TABLE IF EXISTS `region`;

CREATE TABLE `region` (
`id` BIGINT(20) NOT NULL COMMENT 'id',
`region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域编码',
`region_name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地理区域名称',
`level` TINYINT(1) NULL DEFAULT NULL COMMENT '地理区域级别(省、市、县)',
`parent_region_code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级地理区域编码',
PRIMARY KEY(`id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;


# 向 region 表中插入数据:

INSERT INTO `region` VALUES(1, '110000', '北京', 0, NULL);
INSERT INTO `region` VALUES(2, '410000', '河南', 0, NULL);
INSERT INTO `region` VALUES(3, '110100', '北京市', 1, 110000);
INSERT INTO `region` VALUES(4, '410100', '郑州市', 1, 410000);


# 在 数据库 store_db 中,创建表 store_info, 并插入数据。

USE `store_db`;

# 创建 store_info 表

DROP TABLE IF EXISTS `store_info`;
DROP TABLE IF EXISTS `store info`;

CREATE TABLE `store_info` (
`id` BIGINT(20) NOT NULL COMMENT 'id',
`store_name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '店铺名称', 
`reputation` INT(11) NULL DEFAULT NULL COMMENT '信誉等级', 
`region code`  VARCHAR(50) CHARACTER SET Utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '店铺所在地',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT=DYNAMIC;

# 向表 store_info 中插入数据:

INSERT INTO `store_info` VALUES(1, 'XX零食店', 4, '110100');
INSERT INTO `store_info` VALUES(2, 'XX饮品店', 3, '410100');

三、Sharding-JDBC 综合案例-分片策略配置

1、打开 idea 创建 artifactId 名为 dbsharding 的 maven 父工程。


	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( dbsharding )
		Version : 1.0-SNAPSHOT
	--> Name: ( dbsharding )
		Location: ( ...\dbsharding\ )	
	--> Finish
	

2、在 dbsharding 父工程的 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>

    <groupId>djh.it</groupId>
    <artifactId>dbsharding</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>sharding_jdbc_simple</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.0</version>
            </dependency>
            <dependency>
                <groupId>javax.interceptor</groupId>
                <artifactId>javax.interceptor-api</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.0.0</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.16</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.0.0-RC1</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-typehandlers-jsr310</artifactId>
                <version>1.0.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
<!-- ...\dbsharding\pom.xml -->

3、打开 idea 创建 artifactId 名为 shopping 的 maven 子工程(子模块)。


	--> idea  
	--> 右键 dbsharding 父工程 
	--> New --> Module...
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( shopping )
		Version : 1.0-SNAPSHOT
	--> Module Name: ( shopping )
		Content root: ( ...\dbsharding\shopping )
		Module file location: ( ...\dbsharding\shopping )	
	--> Finish
	

4、在 shopping 子工程(子模块)的 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">
    <parent>
        <artifactId>dbsharding</artifactId>
        <groupId>djh.it</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>shopping</artifactId>

    <dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--springfox-swagger-ui
            Springfox Swagger: Spring 基于swagger规范,可以将基于SpringMVCSpring Boot
            项目的项目代码,自动生成JSON格式的描述文件。-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

    </dependencies>

</project>
<!-- dbsharding\shopping\pom.xml -->

5、在 shopping 子工程(子模块)中,创建 商品描述信息 实体 类 ProductDescript.java

/**
 *   dbsharding\shopping\src\main\java\djh\it\shopping\entity\ProductDescript.java
 *
 *   2024-7-3 创建 商品描述信息 实体 类 ProductDescript.java
 */
package djh.it.shopping.entity;

import lombok.Data;

@Data
public class ProductDescript {
    private Long id;
    private Long productInfoId;  //所属商品id
    private String descript;     //商品描述
    private Long storeInfoId;    //店铺id
}

6、在 shopping 子工程(子模块)中,创建 商品基本信息 类 ProductInfo.java

/**
 *   dbsharding\shopping\src\main\java\djh\it\shopping\entity\ProductInfo.java
 *
 *   2024-7-3 创建 商品基本信息 类 ProductInfo.java
 */
package djh.it.shopping.entity;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class ProductInfo {
    private Long productInfoId;
    private Long storeInfoId;  //所属店铺id
    private String productName;  //商品名称
    private String spec;  //规格
    private String regionCode;  //产地
    private BigDecimal price;  //价格
    private String imageUrl;  //商品图片
    关联信息
    private String descript;  //商品描述
    private String placeOfOrigin;  //产地名称
    private String storeName;  //店铺名称
    private int reputation;    //店铺信誉等级

    private String storeRegionNmae;  //店铺地理区域名称

}

7、在 shopping 子工程(子模块)中,创建 地理区域信息 实体 类 region.java

/**
 *  dbsharding\shopping\src\main\java\djh\it\shopping\entity\region.java
 *
 *  2024-7-3 创建 地理区域信息 实体 类 region.java
 */

package djh.it.shopping.entity;

import lombok.Data;

@Data
public class region {
    private Long id;
    private String regionCode;  //地理区域编码
    private String regionNmae;  //地理区域名称
}

8、在 shopping 子工程(子模块)中,创建 店铺信息 实体 类 StoreInfo.java

/**
 *  dbsharding\shopping\src\main\java\djh\it\shopping\entity\StoreInfo.java
 *
 *  2024-7-3 创建 店铺信息 实体 类 StoreInfo.java
 */
package djh.it.shopping.entity;

import lombok.Data;

@Data
public class StoreInfo {

    private Long id;
    private String storeName;  //店铺名称
    private int reputation;    //信誉等级

}

9、在 shopping 子工程(子模块)中,创建 Swagger 接口定义 类 SwaggerConfiguration.java

/**
 *   dbsharding\shopping\src\main\java\djh\it\shopping\config\SwaggerConfiguration.java
 *
 *   2024-7-3 创建 Swagger 接口定义 类 SwaggerConfiguration.java
 */
package djh.it.shopping.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@ConditionalOnProperty(prefix = "swagger", value = {"enable"}, havingValue = "true" )
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket buildDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo())
                .select()
                //要扫描的API(Controller)基础包
                //.apis(RequestHandlerSelectors.any()) //对所有API进行扫描
                .apis(RequestHandlerSelectors //对指定包进行扫描
                    .basePackage("djh.it.dbsharding"))
                .paths(PathSelectors.any()).build();  //对所有路径进行扫描
    }

    //构建API基本信息
    private ApiInfo buildApiInfo(){
        return new ApiInfoBuilder().title("api文档")
                .description("API")
                .version("1.0").build();
    }
}

10、在 shopping 子工程(子模块)中,创建 启动类 SwaggerConfiguration.java

/**
 *   dbsharding\shopping\src\main\java\djh\it\shopping\SwaggerConfiguration.java
 *
 *   2024-7-3 创建 启动类 SwaggerConfiguration.java
 */
package djh.it.shopping;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

11、在 shopping 子工程(子模块)中,创建 配置文件 application.properties 并配置 sharding-jdbc 分片规则配置

#  dbsharding\shopping\src\main\resources\application.properties

server.port = 56082

spring.application.name = shopping
spring.profiles.active = local

server.servlet.context-path = /shopping
spring.http.encoding.enabled = true
spring.http.encoding.charset = utf-8
spring.http.encoding.force = true

spring.main.allow-bean-definition-overriding = true
mybatis.configuration.map-underscore-to-camel-case = true

# sharding-jdbc 分片规则配置:

# 1)配置数据源:真实数据源定义 m为主库,s为从库。m0, m1, m2, s0, s1, s2
spring.shardingsphere.datasource.names = m0,m1,m2,s0,s1,s2

spring.shardingsphere.datasource.m0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m0.url = jdbc:mysql://localhost:3306/store_db?useUnicode=true
spring.shardingsphere.datasource.m0.username = root
spring.shardingsphere.datasource.m0.password = 12311

spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/product_db_1?useUnicode=true
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = 12311

spring.shardingsphere.datasource.m2.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m2.url = jdbc:mysql://localhost:3306/product_db_2?useUnicode=true
spring.shardingsphere.datasource.m2.username = root
spring.shardingsphere.datasource.m2.password = 12311

spring.shardingsphere.datasource.s0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s0.url = jdbc:mysql://localhost:3307/store_db?useUnicode=true
spring.shardingsphere.datasource.s0.username = root
spring.shardingsphere.datasource.s0.password = 12311

spring.shardingsphere.datasource.s1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s1.url = jdbc:mysql://localhost:3307/product_db_1?useUnicode=true
spring.shardingsphere.datasource.s1.username = root
spring.shardingsphere.datasource.s1.password = 12311

spring.shardingsphere.datasource.s2.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s2.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s2.url = jdbc:mysql://localhost:3307/product_db_2?useUnicode=true
spring.shardingsphere.datasource.s2.username = root
spring.shardingsphere.datasource.s2.password = 12311

# 2)配置主、从关系数据库:
# 主库从库逻辑数据源定义 ds0为store_db ds1为product_db_1 ds2为product_db_2
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s0
spring.shardingsphere.sharding.master-slave-rules.ds1.master-data-source-name=m1
spring.shardingsphere.sharding.master-slave-rules.ds1.slave-data-source-names=s1
spring.shardingsphere.sharding.master-slave-rules.ds2.master-data-source-name=m2
spring.shardingsphere.sharding.master-slave-rules.ds2.slave-data-source-names=s2

# 3)配置 分库策略(水平分库):
# 默认分库策略,以store_info_id为分片键,分片策略为store_info_id % 2 + 1,也就是store_info_id为双数的数据进入ds1, 为单数的进入ds2
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column = store_info_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression = ds$->{store_info_id % 2 + 1}


# 4)配置 分表策略(水平分表)
# 4.1) store_info 分表策略,固定分配至ds0的store_info真实表
spring.shardingsphere.sharding.tables.store_info.actual-data-nodes = ds$->{0}.store_info
spring.shardingsphere.sharding.tables.store_info.table-strategy.inline.sharding-column = id
spring.shardingsphere.sharding.tables.store_info.table-strategy.inline.algorithm-expression = store_info

# 4.2) product_info 分表策略
# 数据结点包括:ds1.product_info_1, ds1.product_info_2, ds2.product_info_1, ds2.product_info_2 四个节点。
spring.shardingsphere.sharding.tables.product_info.actual-data-nodes = ds$->{1..2}.product_info_$->{1..2}
# 分片策略(水平分表):分片策略为product_info_id % 2 + 1
spring.shardingsphere.sharding.tables.product_info.table-strategy.inline.sharding-column = product_info_id
spring.shardingsphere.sharding.tables.product_info.table-strategy.inline.algorithm-expression =  product_info_$->{product_info_id % 2 + 1}
# 主键策略(product_info_id 生成为雪花算法,为双数的数据进入 product_info_1表,为单数的进入 product_info_2表)
spring.shardingsphere.sharding.tables.product_info.key-generator.column = product_info_id
spring.shardingsphere.sharding.tables.product_info.key-generator.type = SNOWFLAKE


# 4.3) product descript 分表策略
# 分布在 ds1,ds2 的 product_descript_1 product_descript_2表,分片策略为 product_info_id % 2 + 1,
# id 生成为雪花算法, product_info_id 为双数的数据进入 product_descript_1表,为单数的进入 product_descript_2表
spring.shardingsphere.sharding.tables.product_descript.actual-data-nodes = ds$->{1..2}.product_descript_$->{1..2}
spring.shardingsphere.sharding.tables.product_descript.table-strategy.inline.sharding-column =product_info_id
spring.shardingsphere.sharding.tables.product_descript.table-strategy.inline.algorithm-expression =product_descript_$->fproduct_info_id % 2 + 1}
spring.shardingsphere.sharding.tables.product_descript.key-generator.column=id
spring.shardingsphere.sharding.tables.product_descript.key-generator.type=SNOWFLAKE

# 5)设置 product_info,product_descript为绑定表
spring.shardingsphere.sharding.binding-tables = product_info,product_descript
# 6)设置region为广播表(公共表),每次更新操作会发送至所有数据源
spring.shardingsphere.sharding.broadcast-tables=region

# 7)打开 sql 输出日志
spring.shardingsphere.props.sql.show = true

swagger.enable = true

logging.level.root = info
logging.level.org.springframework.web = info
logging.level.djh.it.dbsharding = debug
logging.level.druid.sql = debug

上一节关联链接请点击
# Sharding-JDBC从入门到精通(7)- Sharding-JDBC 公共表 与 读写分离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/769365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qtreewidget 美化,htmlcss和qss 不是一个概念!已解决

这种样式的美化&#xff0c; 能气死个人&#xff0c;css 一个单词搞定&#xff0c;非要 在qss中。多少个单词不知道了。 m_tree_widget->setStyleSheet("QTreeView{background:transparent; selection-background-color:transparent;}""QTreeView::branch{b…

求函数最小值-torch版

目标&#xff1a;torch实现下面链接中的梯度下降法 先计算 的导函数 &#xff0c;然后计算导函数 在处的梯度 (导数) 让 沿着 梯度的负方向移动&#xff0c; 自变量 的更新过程如下 torch代码实现如下 import torchx torch.tensor([7.5],requires_gradTrue) # print(x.gr…

<电力行业> - 《第16课:电力领域(二)》

3 制造 3.1 电气制造厂 发电厂发电需要发电机&#xff0c;变电站升压降压需要变压器&#xff0c;输电线路输送电能需要电缆&#xff0c;这些主要电气设备的制造商&#xff0c;就是电力设备厂家。 电气设备制造是电力领域市场最基础也是最开放的领域&#xff0c;电力行业内最…

qt 滚动区域简单实验

1.概要 有些时候&#xff0c;想用一个有限的区域显示更多的内容&#xff0c;且内容不固定用滚动区域控件是一个不错的选择&#xff0c;我今天就用一个图片简单的实验一下。 2.代码&#xff08;关键代码&#xff09; #include "widget.h" #include "ui_widget…

法国工程师IMT联盟 密码学及其应用 2023年期末考试题

1 在 Unix 下的安全性 (30 分钟) 1.1 问题 1 1.1.1 问题 我们注意constat到通过 SMTP 服务器发送“假”电子邮件&#xff08;垃圾邮件&#xff09;相对容易。越来越常见的做法是在 SMTP 连接之上部署dployer TLS 协议protocole&#xff08;即 SMTPS&#xff09;。这解决了垃圾…

行为驱动开发(BDD):提升软件质量的新方法

目录 前言1 行为驱动开发的概述1.1 BDD 的起源和发展1.2 BDD 的核心概念 2 BDD 的优势2.1 提高测试的可读性和理解性2.2 增强团队协作2.3 提高软件质量 3 BDD 的实施方法3.1 定义用户故事3.2 编写行为测试3.3 开发和验证3.4 持续集成和反馈 4 BDD 工具和实践4.1 常用的 BDD 工具…

算法day1 两数之和 两数相加 冒泡排序 快速排序

两数之和 最简单的思维方式肯定是去凑两个数&#xff0c;两个数的和是目标值就ok。这里两遍for循环解决。 两数相加 敲了一晚上哈哈&#xff0c;结果超过int范围捏&#xff0c;难受捏。 public class Test2 {public static void main(String[] args) { // ListNode l1 …

矩阵优化递推式子

题目链接 对于f(n)3f(n−1)2f(n−2)2这种式子&#xff0c;先将右边拥有的项竖着列出来&#xff0c;不包括系数&#xff0c;再将这个竖列的下一项写出来&#xff0c;然后将右边的每一项按照左边顺序的等式写出来&#xff0c;然后我们将等式右边只保留系数&#xff0c;那么这些系…

【Java EE】Spring Boot配置文件

Spring Boot配置文件 一、配置文件的分类 一共有三类&#xff0c;分别是 properties, yml, yaml&#xff0c;其中properties相当于是老版&#xff0c;yml是yaml的缩写&#xff0c;这两个相当于新版。 二、配置文件的语法 1. properties 语法的构成是以"." 为分隔…

【微服务网关——服务发现】

1.服务发现 1.1 介绍 服务发现是指用注册中心来记录服务信息&#xff0c;以便其他服务快速查找已注册服务服务发现分类: 客户端服务发现服务端服务发现 1.2 客户端服务发现 客户端服务发现&#xff08;Client-side Service Discovery&#xff09;是一种微服务架构中的模式…

nginx的LNMP构建+discuz论坛

一、LNMP&#xff1a; L&#xff1a;linux 操作系统 N&#xff1a;nginx前端页面的web服务 P&#xff1a;PHP&#xff0c;是一种开发动态页面的编程语言&#xff0c;解析动态页面&#xff0c;起到中间件的作用&#xff08;在nginx和数据库的中间&#xff09;&#xff0c;在中…

该文件没有与之关联的程序来执行该操作,请安装应用,若已经安装应用,请在‘默认应用设置’页面中创建关联。

作为一个喜欢折腾桌面外观的人,我发现桌面上的快捷方式图标都有一个小箭头。于是,我按照网上的方法在注册表中删除了 IsShortcut 键。结果,重启后任务栏上的图标点击时出现了提示:“该文件没有与之关联的程序来执行该操作,请安装应用,若已经安装应用,请在‘默认应用设置…

UnityUGUI之三 Text

富文本 常用语法&#xff1a; 1.加粗 <b> text </b> 2.斜体 <i> text </i> 3.尺寸 <size?> text </size> 4.颜色 <color#ff0000> text </color>

html+js+css美观好看的动态404界面

中间的那一段话&#xff08;root开头的那一句&#xff09;是逐字输出的 那段话显示完后&#xff0c;自动显示超大号字体404 来都来了点个赞&#xff0c;关注一下呗&#x1f604;&#xff0c;本人发誓&#xff1a;你关注我&#xff0c;马上关注你 界面 源码在图片下面…

E1696 无法打开 源 文件 “point.h“

一段时间没碰vs2022突然导入一个项目就出现下面错误 在网上查了很多办法&#xff0c;都没什么有用。 试了试&#xff0c;相对路径可以解决。 但是每次都要用相对路径太麻烦了。 又试了试&#xff0c;发现还是硬件问题&#xff0c;就像摩托长期不开等到突然想开的时候就死活打…

通信软件开发之业务知识:PON口割接什么意思?

一 PON口割接&#xff08;原创总结&#xff09; 在通信领域&#xff0c;PON口割接指的是对无源光网络&#xff08;Passive Optical Network&#xff0c;PON&#xff09;端口进行的切换或调整操作。简单来说&#xff0c;就是对光纤网络中的某个端口进行重新连接或重新分配&…

2024鸿翼加速推进数据要素生产力,“五驾马车”再启新鸿图

过去的2023年&#xff0c;在大家逐步走出3年疫情&#xff0c;对经济复苏的美好期待中&#xff0c;一路“高开低走”的市场态势&#xff0c;相信让许多的数字化从业者感受到了业务的沮丧和寒意。 但是&#xff0c;即便整个行业受经济大环境影响&#xff0c;鸿翼依旧逆势取得了连…

UE5 04-重新加载当前场景

给关卡加一个淡出的效果 给关卡加一个淡入的效果, 这个最好放置在Player 上,这样切关卡依然有这个效果

使用Charles实现Android抓包,附带Charles破解教程

1.下载Charles 网址&#xff1a;下载Charles 安装完成后的界面&#xff1a; 2.配置http抓包 点击该选项 可以看到代理的 ip 和端口号 然后在手机的wifi中配置代理&#xff08;手机和电脑要在同一局域网&#xff09;&#xff0c;代理选择手动&#xff0c;并填入ip和端…

UE5 02-给物体一个扭矩力

需要注意的是: 1.弹簧臂 可以使用绝对旋转 这样就可以不跟随父物体Player的旋转 2.弹簧臂 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机会切换到碰撞点位置 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机不会切换到碰撞点位置