JavaEE技术之MySql高级-ShardingSphere5(SpringBoot版本:3.0.5)

文章目录

  • 1 ShardingSphere-JDBC读写分离
    • 1.1 创建SpringBoot程序
      • 1.1.1、创建项目
      • 1.1.2、添加依赖
      • 1.1.3、创建实体类
      • 1.1.4、创建Mapper
      • 1.1.5、配置 Spring Boot
      • 1.1.6、配置shardingsphere
    • 1.2 测试
      • 1.2.1 读写分离测试
      • 1.2.2 负载均衡测试
      • 1.2.3 事务测试
      • 常见错误
  • 2 ShardingSphere-JDBC垂直分片
    • 2.1 准备服务器
      • 2.1.1、创建server-user容器
      • 2.1.2、创建server-order容器
    • 2.2 程序实现
      • 2.2.1、创建实体类
      • 2.2.2、创建Mapper
      • 2.2.3、配置垂直分片
    • 2.3 测试垂直分片
  • 3 ShardingSphere-JDBC水平分片
    • 3.1 准备服务器
      • 3.1.1、创建server-order0容器
      • 3.1.2、创建server-order1容器
    • 3.2 水平分片
      • 3.2.1、配置一个分片节点
      • 3.2.2、水平分库配置
      • 3.2.3、水平分表配置
    • 3.3 多表关联
      • 3.3.1、创建关联表
      • 3.3.2、创建实体类
      • 3.3.3、创建Mapper
      • 3.3.4、配置关联表
      • 3.3.5、测试插入数据

1 ShardingSphere-JDBC读写分离

1.1 创建SpringBoot程序

1.1.1、创建项目

项目类型:Spring Initializr

SpringBoot脚手架:http://start.aliyun.com

项目名:sharding-jdbc-demo

SpringBoot版本:3.0.5

1.1.2、添加依赖

<dependencies><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>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.4.0</version></dependency><!--兼容jdk17和spring boot3--><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

1.1.3、创建实体类

package com.atguigu.shardingjdbcdemo.entity;@TableName("t_user")
@Data
public class User {@TableId(type = IdType.AUTO)private Long id;private String uname;
}

1.1.4、创建Mapper

package com.atguigu.shardingjdbcdemo.mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {
}

1.1.5、配置 Spring Boot

application.properties:

# 配置 DataSource Driver
spring.datasource.driver-class-name=org.apache.shardingsphere.driver.ShardingSphereDriver
# 指定 YAML 配置文件
spring.datasource.url=jdbc:shardingsphere:classpath:shardingsphere.yaml

1.1.6、配置shardingsphere

shardingsphere.yaml

模式配置:

mode:type: Standalonerepository:type: JDBC

数据源配置:

dataSources:write_ds:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3306/db_userusername: rootpassword: 123456read_ds_0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3307/db_userusername: rootpassword: 123456read_ds_1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3308/db_userusername: rootpassword: 123456

读写分离配置:

rules:- !READWRITE_SPLITTINGdataSources:readwrite_ds:writeDataSourceName: write_dsreadDataSourceNames:- read_ds_0- read_ds_1transactionalReadQueryStrategy: PRIMARY # 事务内读请求的路由策略,可选值:PRIMARY(路由至主库)、FIXED(同一事务内路由至固定数据源)、DYNAMIC(同一事务内路由至非固定数据源)。默认值:DYNAMICloadBalancerName: randomloadBalancers:random:type: RANDOM

输出sql:

props:sql-show: true

1.2 测试

1.2.1 读写分离测试

package com.atguigu.shardingjdbcdemo;@SpringBootTest
class ShardingJdbcDemoApplicationTests {@Autowiredprivate UserMapper userMapper;/*** 写入数据的测试*/@Testpublic void testInsert(){User user = new User();user.setUname("张三丰");userMapper.insert(user);}}

1.2.2 负载均衡测试

/*** 负载均衡测试*/
@Test
public void testSelect(){for (int i = 0; i < 100; i++) {User user1 = userMapper.selectById(1);}
}

负载均衡算法配置:

rules:- !READWRITE_SPLITTINGloadBalancers:random:type: RANDOMround_robin:type: ROUND_ROBINweight:type: WEIGHTprops:read_ds_0: 1read_ds_1: 2

1.2.3 事务测试

transactionalReadQueryStrategy: PRIMARY

事务内读请求的路由策略,可选值:

PRIMARY(路由至主库)

FIXED(同一事务内路由至固定数据源)

DYNAMIC(同一事务内路由至非固定数据源)。默认值:DYNAMIC

测试1:

不添加@Transactional:insert对主库操作,select对从库操作

测试2:

添加@Transactional:则insert和select按照transactionalReadQueryStrategy的配置执行

/*** 事务测试*/
@Transactional//开启事务
@Test
public void testTrans(){User user = new User();user.setUname("铁锤");userMapper.insert(user);List<User> users = userMapper.selectList(null);
}

**注意:**在JUnit环境下的@Transactional注解,默认情况下就会对事务进行回滚(即使在没加注解@Rollback,也会对事务回滚)

常见错误

在这里插入图片描述

ShardingSphere-JDBC远程连接的方式默认的密码加密规则是:mysql_native_password

因此需要在服务器端修改服务器的密码加密规则,如下:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

2 ShardingSphere-JDBC垂直分片

2.1 准备服务器

服务器规划:使用docker方式创建如下容器

在这里插入图片描述

  • 服务器:容器名server-user,端口 3301

  • 服务器:容器名server-order,端口3302

2.1.1、创建server-user容器

  • step1:创建容器:
docker run -d \
-p 3318:3306 \
-v mysql-order-conf:/etc/mysql/conf.d \
-v mysql-order-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-order \
mysql:8
  • step2:登录MySQL服务器:
#进入容器:
docker exec -it server-user env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • step3:创建数据库:
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (id BIGINT AUTO_INCREMENT,uname VARCHAR(30),PRIMARY KEY (id)
);

2.1.2、创建server-order容器

  • step1:创建容器:
docker run -d \
-p 3302:3306 \
-v /atguigu/server/order/conf:/etc/mysql/conf.d \
-v /atguigu/server/order/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name server-order \
mysql:8.0.29
  • step2:登录MySQL服务器:
#进入容器:
docker exec -it server-order env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • step3:创建数据库:
CREATE DATABASE db_order;
USE db_order;
CREATE TABLE t_order (id BIGINT AUTO_INCREMENT,order_no VARCHAR(30),user_id BIGINT,PRIMARY KEY(id) 
);

2.2 程序实现

2.2.1、创建实体类

package com.atguigu.shardingjdbcdemo.entity;@TableName("t_order")
@Data
public class Order {@TableId(type = IdType.AUTO)private Long id;private String orderNo;private Long userId;
}

2.2.2、创建Mapper

package com.atguigu.shardingjdbcdemo.mapper;@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

2.2.3、配置垂直分片

模式配置

mode:type: Standalonerepository:type: JDBC

数据源配置:

dataSources:user_ds:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3301/db_userusername: rootpassword: 123456order_ds:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3302/db_orderusername: rootpassword: 123456

垂直分片配置:

rules:- !SHARDINGtables:t_user:actualDataNodes: user_ds.t_usert_order:actualDataNodes: order_ds.t_order

输出sql:

props:sql-show: true

2.3 测试垂直分片

@Autowired
private UserMapper userMapper;@Autowired
private OrderMapper orderMapper;/*** 垂直分片:插入数据测试*/
@Test
public void testInsertOrderAndUser(){User user = new User();user.setUname("强哥");userMapper.insert(user);Order order = new Order();order.setOrderNo("ATGUIGU001");order.setUserId(user.getId());orderMapper.insert(order);}/*** 垂直分片:查询数据测试*/
@Test
public void testSelectFromOrderAndUser(){User user = userMapper.selectById(1L);Order order = orderMapper.selectById(1L);
}

3 ShardingSphere-JDBC水平分片

3.1 准备服务器

服务器规划:使用docker方式创建如下容器

在这里插入图片描述

  • 服务器:容器名server-order0,端口3310

  • 服务器:容器名server-order1,端口3311

3.1.1、创建server-order0容器

  • step1:创建容器:
docker run -d \
-p 3319:3306 \
-v /atguigu/server/order0/conf:/etc/mysql/conf.d \
-v /atguigu/server/order0/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name server-order2 \
mysql:8.0.29
  • step2:登录MySQL服务器:
#进入容器:
docker exec -it server-order0 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • step3:创建数据库:

注意:水平分片的id需要在业务层实现,不能依赖数据库的主键自增

CREATE DATABASE db_order;
USE db_order;
CREATE TABLE t_order0 (id BIGINT,order_no VARCHAR(30),user_id BIGINT,PRIMARY KEY(id) 
);
CREATE TABLE t_order1 (id BIGINT,order_no VARCHAR(30),user_id BIGINT,PRIMARY KEY(id) 
);

3.1.2、创建server-order1容器

  • step1:创建容器:
docker run -d \
-p 3311:3306 \
-v /atguigu/server/order1/conf:/etc/mysql/conf.d \
-v /atguigu/server/order1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name server-order1 \
mysql:8.0.29
  • step2:登录MySQL服务器:
#进入容器:
docker exec -it server-order1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • **step3:创建数据库:**和server-order0相同

注意:水平分片的id需要在业务层实现,不能依赖数据库的主键自增

CREATE DATABASE db_order;
USE db_order;
CREATE TABLE t_order0 (id BIGINT,order_no VARCHAR(30),user_id BIGINT,PRIMARY KEY(id) 
);
CREATE TABLE t_order1 (id BIGINT,order_no VARCHAR(30),user_id BIGINT,PRIMARY KEY(id) 
);

3.2 水平分片

3.2.1、配置一个分片节点

模式配置

mode:type: Standalonerepository:type: JDBC

数据源配置:

dataSources:user_ds:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3301/db_userusername: rootpassword: 123456order_ds_0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3310/db_orderusername: rootpassword: 123456order_ds_1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.100.101:3311/db_orderusername: rootpassword: 123456

配置一个order分片节点:

rules:- !SHARDINGtables:t_user:actualDataNodes: user_ds.t_usert_order:actualDataNodes: order_ds_0.t_order0

输出sql:

props:sql-show: true

修改Order实体类的主键策略:

//@TableId(type = IdType.AUTO)//依赖数据库的主键自增策略
@TableId(type = IdType.ASSIGN_ID)//分布式id

测试代码:

/*** 水平分片:插入数据测试*/
@Test
public void testInsertOrder(){Order order = new Order();order.setOrderNo("ATGUIGU001");order.setUserId(1L);orderMapper.insert(order);
}

3.2.2、水平分库配置

使用行表达式:核心概念 :: ShardingSphere (apache.org)

将数据 分片到order_ds_0和order_ds_1中

actualDataNodes: order_ds_${0..1}.t_order0

分片算法配置

分片规则:order表中user_id为偶数时,数据插入server-order0服务器user_id为奇数时,数据插入server-order1服务器。这样分片的好处是,同一个用户的订单数据,一定会被插入到同一台服务器上,查询一个用户的订单时效率较高。

rules:- !SHARDINGtables:t_user:actualDataNodes: user_ds.t_usert_order:actualDataNodes: order_ds_${0..1}.t_order0databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: userid_inlineshardingAlgorithms:userid_inline:type: INLINEprops:algorithm-expression: order_ds_${user_id % 2}

测试:

/*** 水平分片:分库插入数据测试*/
@Test
public void testInsertOrderDatabaseStrategy(){for (long i = 0; i < 4; i++) {Order order = new Order();order.setOrderNo("ATGUIGU" + System.currentTimeMillis());order.setUserId(i + 1);orderMapper.insert(order);}
}

3.2.3、水平分表配置

将数据 分片到order_ds_0和order_ds_1的t_order0和t_order1中

actualDataNodes: order_ds_${0..1}.t_order${0..1}

分片算法配置

分片规则:order表中id为偶数时,数据插入t_order0数据库id为奇数时,数据插入t_order1数据库

rules:- !SHARDINGtables:t_user:actualDataNodes: user_ds.t_usert_order:actualDataNodes: order_ds_${0..1}.t_order${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: userid_inlinetableStrategy:standard:shardingColumn: idshardingAlgorithmName: orderid_inlineshardingAlgorithms:userid_inline:type: INLINEprops:algorithm-expression: order_ds_${user_id % 2}orderid_inline:type: INLINEprops:algorithm-expression: t_order${id % 2}

测试:

/*** 水平分片:分表插入数据测试*/
@Test
public void testInsertOrderTableStrategy(){for (long i = 0; i < 4; i++) {Order order = new Order();order.setOrderNo("ATGUIGU" + System.currentTimeMillis());order.setUserId(1L);orderMapper.insert(order);}for (long i = 0; i < 4; i++) {Order order = new Order();order.setOrderNo("ATGUIGU" + System.currentTimeMillis());order.setUserId(2L);orderMapper.insert(order);}
}

3.3 多表关联

3.3.1、创建关联表

server-order0、server-order1服务器中分别创建两张订单详情表t_order_item0、t_order_item1

我们希望同一个用户的订单表和订单详情表中的数据都在同一个数据源中,避免跨库关联,因此这两张表我们使用相同的分片策略。

那么在t_order_item中我们也需要创建order_iduser_id这两个分片键

CREATE TABLE t_order_item0(id BIGINT,user_id BIGINT,order_id BIGINT,price DECIMAL(10,2),`count` INT,PRIMARY KEY(id)
);CREATE TABLE t_order_item1(id BIGINT,user_id BIGINT,order_id BIGINT,price DECIMAL(10,2),`count` INT,PRIMARY KEY(id)
);

3.3.2、创建实体类

package com.atguigu.shardingjdbcdemo.entity;@TableName("t_order_item")
@Data
public class OrderItem {@TableId(type = IdType.ASSIGN_ID) //分布式idprivate Long id;private Long userId;private Long orderId;private BigDecimal price;private Integer count;
}

3.3.3、创建Mapper

package com.atguigu.shargingjdbcdemo.mapper;@Mapper
public interface OrderItemMapper extends BaseMapper<OrderItem> {
}

3.3.4、配置关联表

t_order_item的分片表、分片策略、分布式序列策略和t_order一致

rules:- !SHARDINGtables:t_user:actualDataNodes: user_ds.t_usert_order:actualDataNodes: order_ds_${0..1}.t_order${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: userid_inlinetableStrategy:standard:shardingColumn: idshardingAlgorithmName: orderid_inlinet_order_item:actualDataNodes: order_ds_${0..1}.t_order_item${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: userid_inlinetableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: orderid_item_inlineshardingAlgorithms:userid_inline:type: INLINEprops:algorithm-expression: order_ds_${user_id % 2}orderid_inline:type: INLINEprops:algorithm-expression: t_order${id % 2}orderid_item_inline:type: INLINEprops:algorithm-expression: t_order_item${order_id % 2}

3.3.5、测试插入数据

同一个用户的订单表和订单详情表中的数据都在同一个数据源中,避免跨库关联

   /*** 测试关联表插入*/@Testpublic void testInsertOrderAndOrderItem(){for (long i = 0; i < 2; i++) {Order order = new Order();order.setOrderNo("ATGUIGU" + System.currentTimeMillis());order.setUserId(1L);orderMapper.insert(order);for (long j = 0; j < 2; j++) {OrderItem orderItem = new OrderItem();orderItem.setUserId(1L);orderItem.setOrderId(order.getId());orderItem.setPrice(new BigDecimal(10));orderItem.setCount(2);orderItemMapper.insert(orderItem);}}for (long i = 0; i < 2; i++) {Order order = new Order();order.setOrderNo("ATGUIGU" + System.currentTimeMillis());order.setUserId(2L);orderMapper.insert(order);for (long j = 0; j < 2; j++) {OrderItem orderItem = new OrderItem();orderItem.setUserId(2L);orderItem.setOrderId(order.getId());orderItem.setPrice(new BigDecimal(5));orderItem.setCount(2);orderItemMapper.insert(orderItem);}}}

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

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

相关文章

使用ffmpeg对视频进行转码(支持浏览器播放)

在开发中&#xff0c;算法保存的mp4视频文件通过路径打开该视频发现视频播放不了&#xff0c;需要转码进行播放。使用java代码进行转码。代码如下&#xff0c;inputFilePath是转之前的视频路径&#xff0c;outputFilePath是转之后的视频路径。ffmpeg命令中libx264也可以改为其它…

泉州晋江厦门拉货最便宜的7个方式,建议收藏

众所周知&#xff0c;搬家、拉货的时间长、距离长&#xff0c;运费也比较贵。面对不菲的费用&#xff0c;很多人会比较谨慎&#xff0c;先网上搜搬家攻略&#xff0c;一番对比以后&#xff0c;找到最便宜的运输方式。那怎么运输最便宜最放心呢&#xff1f; 方式一&#xff1a;找…

【iOS】-- 内存五大分区

【iOS】-- 内存五大分区 内存五大分区1.栈区优点&#xff1a; 2.堆区优点&#xff1a; 3.全局区4.常量区5.代码区 验证static、extern、const关键字比较1.static关键字static关键字的作用&#xff1a;全局静态变量局部静态变量 2.extern关键字对内的全局变量对外的全局变量 3.c…

历代著名画家作品赏析-东晋顾恺之

中国历史朝代顺序为&#xff1a;夏朝、商朝、西周、东周、秦朝、西楚、西汉、新朝、玄汉、东汉、三国、曹魏、蜀汉、孙吴、西晋、东晋、十六国、南朝、刘宋、南齐、南梁、南陈、北朝、北魏、东魏、北齐、西魏、北周、隋&#xff0c;唐宋元明清&#xff0c;近代。 一、东晋著名…

ssm+vue的私人健身和教练预约管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的私人健身和教练预约管理系统(有报告)。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

Yolov8实现loopy视频识别

1、前言 loopy是一个非常可爱的动漫角色&#xff08;可爱粉色淀粉肠&#xff09;&#xff0c;闲来无事&#xff0c;打算用yolov8训练一个模型对loopy进行识别。 2、准备工作 先在网络上搜寻很多loopy的图片&#xff0c;然后将图片导入Lablel Studio软件进行标注&#xff0c;并…

三、VGA接口驱动与图像显示动态移动

文章目录 一、参数介绍二、彩条显示2.1 模块系统架构框图2.2 行、场同步波形:2.3 代码三、VGA 图像显示动态移动3.1波形设计3.2代码 一、参数介绍 对于普通的 VGA 显示器&#xff0c;共有 5 个信号&#xff1a;R、G、B 三基色&#xff1b;HS&#xff08;行同步信号&#xff09…

remmina无法连接远程桌面,Remmina无法连接远程桌面的原因与解决办法

在解决Remmina无法连接远程桌面的问题时&#xff0c;我们需要考虑多种可能的原因&#xff0c;并采取相应的解决办法。以下是一些常见的原因及其对应的解决方案&#xff1a; 1、网络问题 原因&#xff1a;不稳定的网络连接或中断可能导致无法建立远程桌面连接。 解决办法&#x…

ICode国际青少年编程竞赛- Python-1级训练场-变量练习

ICode国际青少年编程竞赛- Python-1级训练场-变量练习 1、 a 8 for i in range(8):Dev.step(a)Dev.turnRight()a - 12、 a 3 for i in range(4):Dev.step(a)Dev.turnRight()a a 1 Dev.step(5)3、 a 4 for i in range(4):Dev.step(2)Dev.step(-5)Dev.step(3)Spaceship.…

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候&#xff0c;CPU会轮流使用相同的时间去执行它&#xff0c;即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期&#xff08;SysTick的中断周期可以修改&#xff09;。 比如有三个相同优先级的任务在运行…

练习题(2024/5/8)

1 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;…

Spring后端参数校验——自定义校验方式(validation)

文章目录 开发场景技术名词解释——Spring Validation自定义校验 技术细节小结1.实体参数校验2.自定义校验 完整代码 开发场景 业务场景&#xff1a;新增文章 基本信息 请求路径&#xff1a;/article 请求方式&#xff1a;POST 接口描述&#xff1a;该接口用于新增文章(发布文…

解决:mybatisplus分页查询失效,总是查询到所有数据

目录 问题描述&#xff1a;解决方案&#xff1a;1.配置mybatisplus拦截器PaginationInterceptor2.自行编写SQL语句查询 问题描述&#xff1a; 在前端使用Map<String, Object> params&#xff0c;把page&#xff0c;limit参数作为请求体传送到后端&#xff0c;但是分页查…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

DSP28335开发教程--CCS问题02:Tnteger conversion resulted in truncation

出现黄色警告&#xff0c; 如何解决&#xff1a; 当你看到“integer conversion resulted in truncation”这样的错误或警告时&#xff0c;它通常意味着在数据转换过程中有数据丢失。具体来说&#xff0c;就是将一个较大的数值&#xff08;可能是浮点数、长整型等&#xff09;…

PHPStudy 下载PHP提示“当前网络不稳定,下载失败”

错误信息 当前网络不稳定&#xff0c;下载失败 获取下载链接失败&#xff0c;请检查网络 假查网络 问题原因 xp.cn服务器的网络不稳定&#xff0c;不是你电脑的网络问题。 解决办法 第一步&#xff1a;下载现成的PHP文件 直接下载现成的文件&#xff0c;放到php目录。 将…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

DEV--C++小游戏(吃星星(0.2))

目录 吃星星&#xff08;0.2&#xff09; 简介 分部代码 头文件&#xff08;增&#xff09; 命名空间变量&#xff08;增&#xff09; 副函数&#xff08;新&#xff0c;增&#xff09; 清屏函数 打印地图函数&#xff08;增&#xff09; 移动函数 选择颜色&#xff…

用HAL库改写江科大的stm32入门例子_9-2 利用中断进行串口通讯

电路和 《用HAL库改写江科大的stm32入门例子_9-1》一致。 我们在whlie循环当中&#xff0c;不断查询端口&#xff0c;获取数据&#xff0c;存放到一个数组当中,同时回显给电脑上。这种方法耗费cpu,还是用中断进行串口通讯更合理。 基本操作看到一遍写得比较清晰的博客&#x…

python-oracledb 已率先支持 Oracle 23ai

python-oracledb 介绍 python-oracledb (以下简称 oracledb) 是 Python cx_Oracle 驱动程序的新名称&#xff0c;如果你仍在使用 cx_Oracle&#xff0c;建议升级到最新版本的 oracledb。 oracledb 驱动程序是一个开源模块&#xff0c;使 Python 程序能够访问 Oracle 数据库。默…