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

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 {@AutowiredGoodsMapper goodsMapper;@Testvoid 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 {@AutowiredGoodsMapper goodsMapper;@Testvoid 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 {@AutowiredGoodsMapper goodsMapper;@Testvoid 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 {@AutowiredGoodsMapper goodsMapper;@Testvoid 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);}}@Testpublic void testGoods03(){QueryWrapper wrapper = new QueryWrapper<Goods>();wrapper.eq("gid", 666999L);Goods good = goodsMapper.selectOne(wrapper);System.out.println(good);}}

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将TRIZ技术融入到智能家居的产品设计流程中?

在探讨如何将TRIZ&#xff08;发明问题解决理论&#xff09;技术融入智能家居产品设计流程中时&#xff0c;我们首先需要理解TRIZ作为一种系统化的创新方法论&#xff0c;其核心在于提供一套科学的工具和算法&#xff0c;帮助解决复杂的技术难题&#xff0c;加速产品创新过程。…

(LLM) 很笨

大型语言模型 (LLM) 并非你所想的那样。你被骗了。LLM 很笨&#xff0c;非常笨。事实上&#xff0c;它们更接近数据库&#xff0c;而不是人类。 这就是为什么人工智能仍然处于征服智能的第一步……如果有的话。 终极煤气灯效应 建立前沿人工智能的成本很高。前沿人工智能需要大…

C++系列-多态的基本语法

多态的基本语法 多态的含义静态多态动态多态 多态的底层原理多态中的final和overridefinaloverride: 多态的应用和优点计算器简单实现电脑组装的实现 《游山西村》 南宋陆游 莫笑农家腊酒浑&#xff0c;丰年留客足鸡豚。 山重水复疑无路&#xff0c;柳暗花明又一村。 箫鼓追…

STL—list—模拟实现【迭代器的实现(重要)】【基本接口的实现】

STL—list—模拟实现 1.list源代码 要想模拟实现list&#xff0c;还是要看一下STL库中的源代码。 _list_node里面装着指向上一个节点的指针prev&#xff0c;和指向下一个节点的指针next&#xff0c;还有数据data 并且它给的是void*&#xff0c;导致后面进行节点指针的返回时…

GitHub开源的轻量级文件服务器,可docker一键部署

文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器&#xff0c;不仅支持静态文件服务&#xff0c;还能轻松上传、下载、搜索文件&#xff0c;甚至支持WebDAV&#xff0c;让我们通过Web方式远程管理文件变得轻而易举。…

免费生产设备日志采集工具

使用咨询: 扫码添加QQ 永久免费: Gitee下载最新版本 使用说明: CSDN查看使用说明 功能: 定时(全量采集or增量采集) SCADA,MES等系统采集工控机,办公电脑文件. 优势1: 开箱即用. 解压直接运行.插件集成下载. 优势2: 批管理设备. 配置均在后台配置管理. 优势3: 无人值守 采集端…

软考-软件设计师(程序设计语言习题)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Vue: v-html安全性问题

一、问题描述 可能都知道使用v-html插入富文本&#xff0c;存在安全隐患&#xff0c;比如 cross-site scripting attack&#xff08;xss&#xff09;。但具体什么情况下v-html会引发安全问题呢&#xff1f;是否内容中含有<scrpit>标签就会触发执行脚本呢&#xff1f; 二…

基于vue框架的北城招聘管理平台题目7lly3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,企业,企业信息,职位类型,职位信息,简历信息,职位应聘,求职意愿,面试信息,录取信息,实习信息,冻结信息,解冻信息 开题报告内容 基于Vue框架的北城招聘管理平台 开题报告 一、引言 随着互联网的飞速发展和企业对人才需求的不断增…

Redis的缓存淘汰策略

1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数&#xff0c;maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下&#xff0c; maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…

Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;集合框架&#xff08;Collection Framework&#xff09;提供了一系列用于存储和操作数据的接口和类。其中&#xff0c;Map和Set是两个非常重要的接口&#xff0c;分别用于存储键值对和无重复元素的集合。 ✨✨✨这里是秋刀鱼不做梦…

【蓝桥杯集训100题】scratch时间计算 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第26题

目录 scratch时间计算 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件&#xff0c;可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

力扣: 两数之和 梦开始的地方

文章目录 需求暴力求解优化一下暴力解法用Map结尾 需求 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用…

Leetcode刷题:哈希表

找一个数是否出现过或一个数是否在集合中的时候就要想到用哈希表法 242有效的字母异位词 bool isAnagram(string s, string t) {int table[26];for(char i:s) {table[i-a] 1;}for(char i:t) {table[i-a] -1;}for(int i:table) {if(i!0)return false;}return true;} 349两个数…

docker-harbor私有仓库部署和管理

harbor&#xff1a;开源的企业级的docker仓库软件 仓库&#xff1a;私有仓库 公有仓库 &#xff08;公司内部一般都是私有仓库&#xff09; habor 是有图形化的&#xff0c;页面UI展示的一个工具&#xff0c;操作起来很直观。 harbor每个组件都是由容器构建的&#xff0c;所…

新手教学系列——利用 Loguru 对日志进行分类处理

在现代应用程序中,日志记录是确保系统健康运行的关键因素之一。尤其在复杂的系统中,我们可能需要将日志按不同的需求进行分类和处理。Loguru 作为一款功能强大的日志库,提供了灵活的日志记录方式。今天,我们将探讨如何使用 Loguru 的过滤功能来分类处理系统日志和关键节点日…

算法-矩阵置零(73)

leetcode题目链接 这道题因为要求在O&#xff08;1&#xff09;的空间复杂度下面完成&#xff0c;所以最好的情况就是利用矩阵本身有的元素进行代码编写&#xff0c;而不另外开辟空间。 所以思路如下&#xff1a; 1.遍历第一行第一列&#xff0c;观察是否需要置0&#xff0c…

自定义注解,实现字段加密解密

根据业务需求,要求多部分字段,进行加解密,想到实现方式,就是通过自定义的注解AOP来实现 首先新建一个注解,注意ElementType.FIELD类型,说明这个注解只能作用在字段上 Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) public interface NeedEncrypt { }在新建…

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - trainer篇

[CLIP-VIT-L Qwen] 多模态大模型源码阅读 - trainer篇 前情提要源码阅读导包逐行解读compute_loss方法&#xff08;重构&#xff09;整体含义逐行解读 save_model函数&#xff08;重构&#xff09;整体含义逐行解读 create_optimizer函数&#xff08;重构&#xff09;整体含义…