SpringBoot教程(二十五) | SpringBoot整合Sharding-JDBC分库分表

news2024/9/27 9:28:18

SpringBoot整合Sharding-JDBC分库分表

  • 前言
    • 1. 什么是Sharding?
    • 2. 什么是Sharding-JDBC?
  • 所需的maven依赖
  • 注意点(关于shardingsphere的配置情况)
  • 实操一:如何水平分表
    • 1. 步骤说明
    • 2. 创建数据库和表
    • 3.配置application.properties文件
    • 4. 实体类、mapper接口、test启动类
  • 实操二:如何水平分库
    • 1. 步骤说明
    • 2. 创建数据库和表
    • 3. 配置application.properties文件
    • 4. 实体类、mapper接口、test启动类
  • 实操三:如何水平分库分表
    • 1. 步骤说明
    • 2. 创建数据库和表
    • 3.配置application.properties文件
    • 4. 实体类、mapper接口、test启动类
  • 实操四:如何垂直分表
  • 实操五:如何垂直分库
  • 实操六:如何垂直分库分表
  • 实操七:读写分离
    • 配置application.properties文件
    • 实体类、mapper接口、test启动类

参考文章
【1】SpringBoot+Sharding-JDBC操作分库分表(超超超详细)

前言

1. 什么是Sharding?

Sharding是一种数据库架构技术,它将一个大的数据库或表水平拆分成多个较小的、更易于管理的片段,这些片段被称为shards。
每个shard可以存储数据库的一部分数据,并且通常被部署在独立的数据库服务器上。
Sharding的主要目的是通过横向扩展来提高数据库的性能、可靠性和可扩展性。

2. 什么是Sharding-JDBC?

Sharding-JDBC早期是由当当网开源的分布式数据库中间件,后期该项目被放入到ShardingSphere项目下,Sharding-JDBC是一个轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务, 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架

在使用Sharding-JDBC首先要清楚以下几点
1.它是一个轻量级的Java框架,可以理解是增强的JDBC驱动
2.Sharding-JDBC是不做分库分表的,库与表是由数据库工程师分好的,通过引入Sharding-JDBC.jar配置好配置,解决多数据源切换与多数据源的操作

所需的maven依赖

主要为 sharding-jdbc-spring-boot-starter、druid

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

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

<!-- 数据库连接驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- 数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

<!-- sharding-jdbc 数据库分库分表 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

细节注意:

引入sharding-jdbc-spring-boot-starter依赖时 不要同时引入 druid-spring-boot-starter依赖,
不然会出现Mapper 的bean的创建失败,sqlSessionFactory或sqlSessionTemplate属性没有被正确设置或注入(Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required)的情况.

解决方案:将druid-spring-boot-starter修改为

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>

原因:是因为引入了sharding,数据源指向了sharding数据源,druid启动器和sharding数据源出现了冲突,加载druid数据源失败而报错。

注意点(关于shardingsphere的配置情况)

(1)key-generator.column(主键字段)设定后,
当指定的列 未显式设值的(set操作)就会自动赋值生成 策略格式的数据,
当指定的列 存在显式设值的(set操作),就不会用策略格式的主键数据

实操一:如何水平分表

水平分表的意思:在同一个库中创建多个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding
  2. 在sharding中创建表goods_1、goods_2
  3. 约定规则: 添加数据时
    商品id是偶数把数据加入goods_1表,奇数把数据加入goods_2表

2. 创建数据库和表

在这里插入图片描述

create database sharding;
use sharding;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3.配置application.properties文件

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 由于上面配置数据源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置表的分布
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g1.goods_$->{1..2}

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定表分片策略 
# 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

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

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods01() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId(100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
gid 为偶数 在1号表,为奇数 在2号表
在这里插入图片描述

实操二:如何水平分库

水平分库的意思:在多个库中 创建 一个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding_1、sharding_2
  2. 在sharding_1、sharding_2中创建表goods
  3. 约定规则: 添加数据时
    用户id是偶数把数据加入sharding_1库,奇数把数据加入sharding_2库

2. 创建数据库和表

在这里插入图片描述

create database sharding_1;
use sharding_1;
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

create database sharding_2;
use sharding_2;
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3. 配置application.properties文件

重点配置

# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods

完整配置

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定数据库分片策略
# 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

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

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods02() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
用户id 为偶数 在1号库,为奇数 在2号库

在这里插入图片描述

实操三:如何水平分库分表

水平分库分表:在同多个库中创建多个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding_1、sharding_2
  2. 在sharding_1、sharding_2中都创建表goods_1、goods_2
  3. 约定规则: 添加数据时
    用户id是偶数把数据加入sharding_1库,奇数把数据加入sharding_2库
    商品id是偶数把数据加入goods_1表,奇数把数据加入goods_2表

2. 创建数据库和表

在这里插入图片描述

create database sharding_1;
use sharding_1;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

create database sharding_2;
use sharding_2;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3.配置application.properties文件

重点配置

# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}        

# 指定数据库分片策略 
# 约定user_id值是偶数添加到goods_db_1库中,奇数添加到goods_db_2库中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

完整配置

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}        

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定数据库分片策略 
# 约定user_id值是偶数添加到goods_db_1库中,奇数添加到goods_db_2库中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}
 
# 指定表分片策略 
# 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

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

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods03() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
user_id 为偶数 在1号库,为奇数 在2号库
gid 为偶数 在1号表,为奇数 在2号表
在这里插入图片描述

实操四:如何垂直分表

后续分享

实操五:如何垂直分库

后续分享

实操六:如何垂直分库分表

后续分享

实操七:读写分离

首先"主从复制 读写分离" 这两个是结合在一起来,却少了谁都无法提高数据库系统的性能和可靠性的。
主从复制:简单来说就是在主服务器上执行的语句,从服务器执行同样的语句,在主服务器上的操作在从服务器产生了同样的结果。(这部分是服务器之间的配置进行实现的)

只有主从复制做好了,读写分离才能进行

以下我把g1当成主数据库,g2当成从数据库
新增的数据全部去g1,查的时候只查g2

配置application.properties文件

重点配置

#========主从数据库声明部分========
#配置指定主从数据库(配置一个ms0对象。设置了主库和从库的变量)
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=g1
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=g2
#========数据节点配置部分========
#设置数据节点
#也就是要访问的数据库及表的名称(在这里设置的为ms0里面库的goos表)
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=ms0.goods

完整配置

# 读写分离
# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


#========主从数据库声明部分========
#配置指定主从数据库(配置一个ms0对象。设置了主库和从库的变量)
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=g1
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=g2
#========数据节点配置部分========
#设置数据节点
#也就是要访问的数据库及表的名称(在这里设置的为ms0里面库的goos表)
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=ms0.goods


# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定表分片策略
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods



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

实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods03() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

    @Test
    public void testGoods03(){
        QueryWrapper wrapper = new QueryWrapper<Goods>();
        wrapper.eq("gid", 666999L);
        Goods good = goodsMapper.selectOne(wrapper);
        System.out.println(good);
    }


}

测试新增操作的截图
可以发现全部指向了g1库去增加
在这里插入图片描述
测试查询的截图
可以发现查询去的库是 g2库
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java反序列化之CommonCollections1利⽤链的学习

一、源起 1、代码示例 既然学习cc1链&#xff0c;那么总要先了解下cc1链能造成任意代码执行的原因&#xff0c;这里引用P神的代码来进行讲解&#xff1a; ps:环境使用&#xff1a; CommonsCollections < 3.2.1java < 8u71 import org.apache.commons.collections.Trans…

【Python机器学习】NLP分词——利用分词器构建词汇表(一)

在NLP中&#xff0c;分词&#xff08;也称切词&#xff09;是一种特殊的文档切分过程。而文档切分能够将文本切分成更小的文本块或片段&#xff0c;其中含有更集中的信息内容。文档切分可以是将文本分成段落&#xff0c;将段落分成句子&#xff0c;将句子分成短语&#xff0c;或…

C语言学习——文件

目录 十三、文件 13.1C文件概述 13.2文件类型指针 13.3文件的打开与关闭 文件的打开&#xff08;fopen函数&#xff09; 文件的关闭&#xff08;fclose函数&#xff09; 13.4文件的读写 fputc函数和fgetc函数&#xff08;putc函数和getc函数&#xff09; fread函数和fw…

在亚马逊云科技上通过LangChain ReAct Agent开发金融多模态数据AI分析中台

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技机器学习托…

简易版营业厅宽带系统

TOC ssm018简易版营业厅宽带系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管…

音频Transformer架构

第3单元:音频Transformer架构 本课程中,我们主要关注Transformer模型以及它们如何应用于音频任务。虽然您不需要了解这些模型的内部细节,但了解使它们工作的主要概念很有用,因此我们在本小节中回顾一下关于Transformer的知识。有关transformer的深入了解,请查看我们的NLP…

互联网的发展是否加剧了数字鸿沟?

有人问&#xff1a;互联网的发展是否加剧了数字鸿沟。 互联网的发展确实在某种程度上加剧了数字鸿沟。虽然互联网的普及为全球范围内的人们提供了前所未有的访问信息、教育资源和经济机会的机会&#xff0c;但其发展也凸显并放大了不同群体之间的差距&#xff0c;比如以下几个…

dokcer 安装 redis(单机版)

准备工作 拉取redis镜像 docker pull redis 通过docker-compose 安装redis 很方便、很简单 先安装docker&#xff0c;参考我这个安装示例进行安装 https://blog.csdn.net/qq_33192671/article/details/13714973 然后安装docker-compose&#xff0c;要是拉取docker-compose无…

【在Linux世界中追寻伟大的One Piece】IO基础

目录 1 -> 回顾 1.1 -> 回顾C文件接口 1.2 -> 总结 2 -> 系统文件I/O 3 -> 接口介绍 3.1 -> open 3.2 -> open函数返回值 3.3 -> 文件描述符fd 4 -> 0 & 1 & 2 5 -> 文件描述符的分配规则 6 -> 重定向 7 -> 使用dup2系…

跨链互通:Web3如何实现多链互操作性

随着区块链技术的发展&#xff0c;各类区块链网络不断涌现&#xff0c;然而&#xff0c;不同链之间的互操作性问题成为了一个重要挑战。跨链互通&#xff08;Cross-chain Interoperability&#xff09;技术正是为了解决这一问题&#xff0c;旨在打破各区块链网络间的壁垒&#…

恒创科技:如何管理和减少Windows服务器 CPU 负载?

CPU 负载是衡量网络服务器或计算机中央处理器 (CPU) 在任意给定时间内处理工作量的指标。它通常表示 CPU 正在执行或排队等待处理的进程数。 如何读取和管理CPU负载&#xff1a; 对于 Windows 系统 Windows 本身不支持“top”和“ps”命令&#xff0c;而类 Unix 系统则支持。不…

Xinstall助力App运营,邀请码自动识别,效率翻倍!

在App推广和运营的道路上&#xff0c;邀请码一直是一个让人又爱又恨的存在。它能够帮助我们追踪用户来源&#xff0c;衡量推广效果&#xff0c;但同时&#xff0c;繁琐的填写步骤也让许多潜在用户望而却步。然而&#xff0c;随着Xinstall的出现&#xff0c;这一切都将迎来颠覆性…

Promise学习之同步与异步

目录 前言 一、同步与异步 (一) 同步 (二) 异步 二、总结 (一) 同步 (二) 异步 前言 Java有多线程&#xff0c;前端有同步与异步&#xff0c;异步操作可以优化用户体验、提高性能与响应、处理并发与并行任务等等&#xff0c;异步操作有发送Ajax请求、读文件等&#xff0…

简明的Arthas故障排查实践

写在文章开头 Arthas是一款强大的开源Java诊断程序,它可以非常方便的启动并以界面式的方式和Java程序进行交互,支持监控程序的内存使用情况、线程信息、gc情况、甚至可以反编译并修改现上代码等。所以它成为笔者进行线上问题排查的重要手段,而本文将从实际使用的角度介绍一下…

我带着我的未来回来了!

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…

第九周:机器学习笔记

第九周机器学习周报 摘要Abstract机器学习——Spatial Transformer1.1 How to transform an image/feature map?&#xff08;怎么做&#xff09;1.2 Interpolation&#xff08;插值&#xff09;1.3 spatial Transformer的应用 Pytorch学习1. 线性层2. 其他层的介绍3. 搭建小实…

Leetcode 237.19.83.82 删除链表重复结点 C++实现

Leetcode 237. 删除链表中的节点 问题&#xff1a;有一个单链表的head&#xff0c;我们想删除它其中的一个节点node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点head。链表的所有值都是唯一的&#xff0c;并且保证给定的节点 node不是链表中的最后一个节点。删除…

buuctf [ACTF新生赛2020]usualCrypt

前言&#xff1a;学习笔记。 常规&#xff1a; 下载 解压 查壳。 32位IDA pro打开 先查找字符串 在进入main() 分析&#xff1a; 关键函数&#xff1a; 第一部分&#xff1a; 大写转小写 小写转大写。 已知&#xff1a; 密文&#xff0c;以及加密过程由三部分组成。 那么逆向…

一款电容型、非接触式感知的智能水浸模组-WS11

水侵模组 - WS11&#xff08;Water Sensor-MC11S&#xff09;是一款电容型、非接触式感知的智能水浸模组&#xff0c;集成了高集成度差分式数字电容芯片MC11S。模组内嵌MCU&#xff0c;通过UART输出电容和检测状态信息&#xff0c;进行算法分析&#xff0c;有效滤除振动、凝露等…

Android自定义一个带背景的圆环形进度条(Kotlin)

前言 在Android开发过程中&#xff0c;难免遇到一些复杂的UI组件需要我们自定义 当然使用系统原生组件拼凑也能完成&#xff0c;但是UI复杂度增加了不说&#xff0c;在更新UI状态的时候还不好管理&#xff0c;最重要的是复用的价值不大&#xff0c;上述的操作很容易引增加码冗…