分库分表、读写分离--ShardingJDBC

news2024/11/17 9:23:37

1. 项目准备

1.1 建立数据库表

建立user_manage数据库,在该库中建立1张表app_user用来做分库前的测试,另外建12张按月份命名的表app_user_2024XX用来做分库。

CREATE DATABASE IF NOT EXISTS user_manage
CHARACTER SET utf8
COLLATE utf8_general_ci;

USE user_manage;

CREATE TABLE `app_user` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202401` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202402` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202403` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202404` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202405` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202406` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202407` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202408` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202409` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202410` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202411` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

CREATE TABLE `app_user_202412` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(255) NOT NULL,
    `age` INT(10) NOT NULL,
    `sex` CHAR(1) NOT NULL,
    `address` VARCHAR(100) DEFAULT NULL,
    `phone` VARCHAR(20) DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `deleted` TINYINT(1) DEFAULT 0
) ENGINE = INNODB DEFAULT CHARSET = UTF8;

在这里插入图片描述

1.2 项目搭建-集成mybatisplus

目录结构
在这里插入图片描述
pom文件

<?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>com.gzdemo</groupId>
    <artifactId>shardingjdbc-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <lombok.version>1.18.8</lombok.version>
        <mysql.version>5.1.46</mysql.version>
        <mybatis.version>3.5.1</mybatis.version>
        <mybatis.plus.version>3.4.1</mybatis.plus.version>
    </properties>

    <!-- 继承Spring boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>


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

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

        <!-- Mysql 数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    username: root
    password: root
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.gzdemo.shardingdemo.pojo

AppUser

import lombok.Data;
import java.util.Date;

@Data
//默认映射到app_user表
public class AppUser {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String address;
    private String phone;
    private Date create_time;
    private Date update_time;
    private Short deleted;
}

AppUserService

public interface AppUserService extends IService<AppUser> {

    boolean addOne(AppUser appUser);
}

AppUserServiceImpl

@Service
public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService {

    @Autowired
    AppUserMapper appUserMapper;

    @Override
    public boolean addOne(AppUser appUser){
        return appUserMapper.insertOne(appUser);
    }
}

AppUserMapper

@Mapper
public interface AppUserMapper extends BaseMapper<AppUser> {

    boolean insertOne(@Param("user") AppUser appUser);
}

AppUserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gzdemo.shardingdemo.dao.AppUserMapper">

    <insert id="insertOne" parameterType="com.gzdemo.shardingdemo.pojo.AppUser">
        insert into `app_user`
            (id,name,age,sex,address,phone,create_time,update_time,deleted)
        values(#{user.id},#{user.name},#{user.age},#{user.sex},#{user.address},#{user.phone},
               #{user.create_time},#{user.update_time},#{user.deleted});
    </insert>
</mapper>

AppUserController

@RestController
@RequestMapping("/appUser")
public class AppUserController {

    @Autowired
    AppUserService appUserService;

    @PostMapping("/add")
    public String addAppUser(@RequestBody AppUser appUser){

		appUser.setCreate_time(new Date());
        appUser.setUpdate_time(new Date());
        appUserService.save(appUser); //mybatisplus生成

        appUser.setId(appUser.getId()+1000);
        appUserService.addOne(appUser); //手写的sql
        return "成功";
    }
}

ShardingJdbcDemoApplication

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

1.3 postman测试

在这里插入图片描述
数据插入到了app_user表中,mybatisplus没问题
在这里插入图片描述

2. 分库分表实战

添加依赖

<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
	<version>5.0.0</version>
</dependency>

<!--druid-->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.21</version>
</dependency>

2.1 分表

更改application.yml配置
包括配置数据源、配置逻辑表、配置分片算法
在这里插入图片描述
测试
在这里插入图片描述
查看数据库,发现数据被插入到app_user_202406表里
在这里插入图片描述

2.2 分库

再新建3个数据库,接下来将所有数据分在4个库里。
在这里插入图片描述

更改配置

  • 添加数据源
    在这里插入图片描述
  • 设置分库策略
    在这里插入图片描述
  • 配置分库算法
    这里的算法是取appUser的id的hash值除以取模4求余,再取绝对值,根据结果放在ds0,ds1,ds2,ds3库里
    在这里插入图片描述
    测试
    写一个mapping测试
@PostMapping("/addBatch")
    public String addAppUser(){
        List<AppUser> list = new ArrayList<>();
        for (int i = 0;i<100;i++){
            AppUser appUser = new AppUser();
            appUser.setId(11001+i);
            System.out.print(Math.abs(appUser.hashCode()%4)+",");
            appUser.setSex("0");
            appUser.setName("zhangsan"+i);
            appUser.setAge(25);
            appUser.setDeleted((short)0);
            appUser.setCreate_time(new Date());
            list.add(appUser);
        }

        appUserService.saveBatch(list);
        return "成功";

发送请求
在这里插入图片描述查看数据库,发现4个库的app_user_202406表里都有数据
在这里插入图片描述

2.3 分库分表后读取数据

@GetMapping("/list")
    public List<AppUser> list(){
        return appUserService.list();
    }

测试发现把所有分库的所有表都读取出来了

在这里插入图片描述

2.4 分库分表完整配置

server:
  port: 8080

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1,ds2,ds3
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_03?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root

    rules:
      sharding:
        tables:
          #配置逻辑数据库
          app_user:
            #数据库节点
            actual-data-nodes: ds$->{0..3}.app_user_$->{202401..202412}
            #分表策略
            table-strategy:
              standard:
                #分片键为 created_time  根据哪个字段分片,该字段叫分片键
                sharding-column: create_time
                #分表算法为
                sharding-algorithm-name: app-user-table-inline
            #分库策略
            database-strategy:
              standard:
                #分库列为id列
                sharding-column: id
                #分库算法 database_inline
                sharding-algorithm-name: app-user-database-inline

        #算法配置
        sharding-algorithms:
          #订单表分表算法
          app-user-table-inline:
            type: INTERVAL
            props:
              datetime-pattern: yyyy-MM-dd HH:mm:ss
              datetime-lower: 2024-01-01 00:00:00
              datetime-upper: 2024-12-01 00:00:00
              sharding-suffix-pattern: yyyyMM
              datetime-interval-unit: MONTHS
          #分库算法配置
          app-user-database-inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{Math.abs(id.hashCode()%4)}

# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.gzdemo.shardingdemo.pojo

3. 读写分离

使两个主库ds0,ds1负责写数据,因此把分库算法中取模4设置为取模2

ds0作为主库负责写,ds2负责读;ds1作为主库负责写,ds1和ds3负责读

配置

          #分库算法配置
          app-user-database-inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{Math.abs(id.hashCode()%2)}
    rules:
      #读写分离配置
      readwrite-splitting:
        data-sources:
          ds0:
            #主数据源
            write-data-source-name: ds0
            #从数据源
            read-data-source-names: ds2
            #负载均衡算法
            load-balancer-name: random
          ds1:
            #主数据源
            write-data-source-name: ds1
            #从数据源
            read-data-source-names: ds1,ds3
            #负载均衡算法
            load-balancer-name: random
        #负载均衡算法
        load-balancers:
          round-robin:
            type: ROUND_ROBIN
          random:
            type: RANDOM

修改user_manage库(ds0)中的i第一个name为zhangsanmanage;
修改user_manage_01库(ds1)中的i第一个name为zhangsanmanage01;
修改user_manage_02库(ds2)中的i第一个name为zhangsan3manage02;
修改user_manage_03库(ds3)中的i第一个name为zhangsanmanage03;

在这里插入图片描述

测试list接口,发现每次请求id为11004的只有来自于ds02的数据;
而id为11001的由于采用random算法,有时候只有来自于ds03的数据,有时候ds01和ds03的都有;
当采用rr算法时,发现每次只有来自于ds03的数据。没有ds02的数据。
这里暂时还不清楚原因。
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. 分库分表、读写分离所有配置

server:
  port: 8080

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1,ds2,ds3
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root
      ds3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.200.131:3306/user_manage_03?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
        username: root
        password: root

    rules:
      sharding:
        tables:
          #配置逻辑数据库
          app_user:
            #数据库节点
            actual-data-nodes: ds$->{0..3}.app_user_$->{202401..202412}
            #分表策略
            table-strategy:
              standard:
                #分片键为 created_time  根据哪个字段分片,该字段叫分片键
                sharding-column: create_time
                #分表算法为
                sharding-algorithm-name: app-user-table-inline
            #分库策略
            database-strategy:
              standard:
                #分库列为id列
                sharding-column: id
                #分库算法 database_inline
                sharding-algorithm-name: app-user-database-inline

        #算法配置
        sharding-algorithms:
          #订单表分表算法
          app-user-table-inline:
            type: INTERVAL
            props:
              datetime-pattern: yyyy-MM-dd HH:mm:ss
              datetime-lower: 2024-01-01 00:00:00
              datetime-upper: 2024-12-01 00:00:00
              sharding-suffix-pattern: yyyyMM
              datetime-interval-unit: MONTHS
          #分库算法配置
          app-user-database-inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{Math.abs(id.hashCode()%2)}

      #读写分离配置
      readwrite-splitting:
        data-sources:
          ds0:
            #主数据源
            write-data-source-name: ds0
            #从数据源
            read-data-source-names: ds2
            #负载均衡算法
            load-balancer-name: random
          ds1:
            #主数据源
            write-data-source-name: ds1
            #从数据源
            read-data-source-names: ds1,ds3
            #负载均衡算法
            load-balancer-name: random
        #负载均衡算法
        load-balancers:
          round-robin:
            type: ROUND_ROBIN
          random:
            type: RANDOM


# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.gzdemo.shardingdemo.pojo

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

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

相关文章

【Python Cookbook】S1E08 在两个字典中寻找相同点

目录 问题解决方案讨论 问题 在两个字典中&#xff0c;如果我们想要找到其中相同的地方&#xff0c;比如相同的键、相同的值等。 解决方案 考虑以下两个字典以及其中内容&#xff1a; a {x: 1,y: 2,z: 3 }b {w: 10,x: 11,y: 2 }要找出这两个字典中的相同之处&#xff0c;…

Linux中部署MinIO

Linux中部署MinIO 下载MinIO可执行程序&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限&#xff1a; chmod x minio 创建存储目录&#xff0c;例如/data&#xff1a; mkdir -p /data 运行MinIO服务器&#xff0c;需要设置MIN…

数据结构与算法 :数据结构绪论,时间和空间复杂度 推导大O阶

各位少年 大家好 我是博主那一脸阳光&#xff0c;今天开始给大家分享数据结构&#xff0c;由于我个人当初学的时候是自学&#xff0c;并没有看培训机构的视频 所以接下来我分享的数据结构的内容&#xff0c;源头来自一本书叫做大话数据结构。顺便一提为了方面大家理解&#xff…

PHP框架开发的内容付费问答解惑系统附带seo优化

default默认是百度问答模板 sowenda是高仿360问答的。 soso模板是仿腾讯soso问答界面。 一套wap模板&#xff0c;仿天涯问答的手机版。 pc和wap模板后台设置里自由切换&#xff0c;还可以绑定手机独立二级域名。 强大的搜索功能&#xff0c;支持xunsearch全文检索&#xff0c;s…

springboot基本使用十二(PageHelper分页查询)

引入依赖&#xff1a; <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version> </dependency> 通个PageHelper.startPage(page,pageSize)方…

02 在虚拟机中安装Linux

课程目标 1、理解VMware中各个选项的作用 2、理解Linux安装过程中的各种选项和配置作用 课程实验 在VMware中安装centos7.9操作系统并确保网络通常 课堂引入 在看过了Linux桌面的各种炫酷的效果后(其实很多操作&#xff0c;在互动上并不比Windows和MacOS差多少)&#xff…

Compose CompositionLocal

文章目录 Compose CompositionLocal概述使用compositionLocalOfstaticCompositionLocalOf 和 compositionLocalOf 总结 Compose CompositionLocal 概述 Compose 提供了 CompostionLocal 用来完成 composable 树中共享数据方式。CompositionLocals 是具有层级的&#xff0c;可…

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…

变压器励磁涌流MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 变压器励磁涌流的产生机理 1、变压器是电力系统的关键部分&#xff0c;在实际的 运行中&#xff0c;变压器需要进行相应的充电&#xff0c;而在充电的过 程中&#xff0c;就需要进行开合闸作业。在开合闸作业…

一文读懂存内计算与近存计算的分类与应用

存内计算与近存计算-基础理论及分类 技术基础知识和分类 "近存计算"与"存内计算"易混淆&#xff0c;本章明晰其分类&#xff0c;并比较各内存驱动方法的独特优势。可计算存储器设备可作分立加速器或替代现有存储模块。我们深入剖析每种方法的利弊&#xf…

SOFA-RPC学习记录

文章目录 需求分析模块划分微服务模块交互模块 可拓展架构插件机制 功能分析交互模块 学习微服务模块交互模块 dubbo与nacos集成学习Nacos配置中心实战 dubbo与apollo集成学习配置中心组件与k8s的抉择参考资料 结论 本报告旨在深入学习SOFA-RPC框架&#xff0c;特别是其动态配置…

深入解析芯片背后的技术:揭开半导体产业的神秘面纱

引言&#xff1a; 在这个数字化、信息化的时代&#xff0c;芯片已经成为了现代科技发展的重要基石。从智能手机、电脑到汽车、物联网设备&#xff0c;芯片无处不在。然而&#xff0c;对于大多数人来说&#xff0c;芯片背后的技术仍然是一个神秘而遥不可及的领域。本文将深入解…

双指针练习:快乐数

1.题目链接&#xff1a;202.快乐数 2.题目描述&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无…

vue2+antv/x6实现er图

效果图 安装依赖 npm install antv/x6 --save 我目前的项目安装的版本是antv/x6 2.18.1 人狠话不多&#xff0c;直接上代码 <template><div class"er-graph-container"><!-- 画布容器 --><div ref"graphContainerRef" id"gr…

先导微型数控桌面式加工中心

随着数控技术、传感器技术、人工智能等技术的不断发展&#xff0c;制造业的快速发展和技术的不断进步&#xff0c;小型五轴加工中心的性能将不断提升&#xff0c;五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段&#xff0c;使其具有更广泛的应用前景。小型五轴加…

企业微信接入系列-上传临时素材

企业微信接入系列-上传临时素材 文档介绍上传临时素材写在最后 文档介绍 创建企业群发的文档地址&#xff1a;https://developer.work.weixin.qq.com/document/path/92135&#xff0c;在创建企业群发消息或者群发群消息接口中涉及到上传临时素材的操作&#xff0c;具体文档地址…

【二进制部署k8s-1.29.4】七、验证master的安装

文章目录 简介 一.确认kubectl命令是否正常运行二.确认etcd安装是否正常运行三.确认kube-apiserver,kube-controller-manager,kube-scheduler安装是否正常四.配置apiserver和kubelet的访问授权五.master端安装脚本4.1.安装master端所需文件4.2.master快捷安装脚本 简介 本章节主…

北邮22级信通院DSP:IIR_DF系统3.0版:从H(p)到H(s):一种更为严谨精确的运算模式

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 承接上一篇博客 北邮22级信通院DSP&#xff1a;IIR_DF系统2.0版&#xff1a;…

深入pandas:数据分析

目录 前言 第一点&#xff1a;导入模块 第二点&#xff1a;准备数据 第三点&#xff1a;简单的分析数据 第四点&#xff1a;【重点】数据透支 总结 前言 在数据分析与挖掘的领域&#xff0c;了解如何使用工具和方法来探索数据是至关重要的。本文将探讨如何利用Python中的…

洛谷P1035 级数求和 题解

#题外话&#xff08;第42篇题解&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P1035#思路 没啥思路&#xff0c;这其实偏向模拟一点&#xff0c;按照题目说的做就行了。 #代码 原来是这个熊样的&#xff08;都能AC&#xff0c;优化的问题&#xff09; …