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

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: 8080spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: 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 {@AutowiredAppUserMapper appUserMapper;@Overridepublic 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 {@AutowiredAppUserService 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); //手写的sqlreturn "成功";}
}

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: 8080spring:shardingsphere:datasource:names: ds0,ds1,ds2,ds3ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds3:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_03?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootrules: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_inlinesharding-algorithm-name: app-user-database-inline#算法配置sharding-algorithms:#订单表分表算法app-user-table-inline:type: INTERVALprops:datetime-pattern: yyyy-MM-dd HH:mm:ssdatetime-lower: 2024-01-01 00:00:00datetime-upper: 2024-12-01 00:00:00sharding-suffix-pattern: yyyyMMdatetime-interval-unit: MONTHS#分库算法配置app-user-database-inline:type: INLINEprops: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: INLINEprops: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: randomds1:#主数据源write-data-source-name: ds1#从数据源read-data-source-names: ds1,ds3#负载均衡算法load-balancer-name: random#负载均衡算法load-balancers:round-robin:type: ROUND_ROBINrandom: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: 8080spring:shardingsphere:datasource:names: ds0,ds1,ds2,ds3ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_02?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootds3:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.131:3306/user_manage_03?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: rootrules: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_inlinesharding-algorithm-name: app-user-database-inline#算法配置sharding-algorithms:#订单表分表算法app-user-table-inline:type: INTERVALprops:datetime-pattern: yyyy-MM-dd HH:mm:ssdatetime-lower: 2024-01-01 00:00:00datetime-upper: 2024-12-01 00:00:00sharding-suffix-pattern: yyyyMMdatetime-interval-unit: MONTHS#分库算法配置app-user-database-inline:type: INLINEprops: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: randomds1:#主数据源write-data-source-name: ds1#从数据源read-data-source-names: ds1,ds3#负载均衡算法load-balancer-name: random#负载均衡算法load-balancers:round-robin:type: ROUND_ROBINrandom:type: RANDOM# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:mapper-locations: classpath*:mapper/*.xml# 设置别名包扫描路径,通过该属性可以给包中的类注册别名type-aliases-package: com.gzdemo.shardingdemo.pojo

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

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

相关文章

Python中的__str__和__repr__:揭示字符串表示的奥秘

标题&#xff1a;Python中的__str__和__repr__&#xff1a;揭示字符串表示的奥秘 摘要 在Python中&#xff0c;对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法&#xff0c;用于定义对象的字符串表示形式。尽管它们在功能上相似&#xff0c;…

vm-bhyve网卡设定桥接故障解决@FreeBSD

问题 在使用vm-bhyve虚拟机管理软件的时候&#xff0c;使用vm无法绑定网卡igb0 vm switch add public igb0 报错&#xff1a;/usr/local/sbin/vm: ERROR: failed to add member igb0 to the virtual switch public 解决 于是准备用原生ifconfig命令来绑定&#xff0c;结果…

【Go基础】快速入门

Go基础入门 用20%的时间学习常用80%的语法 官方网址&#xff08;下载安装/官方文档/官方类库&#xff09; Download Go binaries from https://go.dev/dl/Reference the official Go documentation https://go.dev/doc/See all the the Go packages https://pkg.go.dev/Access…

Linux基础指令及其作用之网络操作

网络操作pingifconfigeth0 接口 ip常用选项和命令 netstat示例输出解释 curl示例输出及解释 wget示例输出解释 网络操作 ping ping 命令用于测试网络连接的连通性和响应时间。它通过向目标主机发送 ICMP 回显请求&#xff08;echo request&#xff09;数据包&#xff0c;并等…

wpf 依赖属性的含义理解

依赖属性允许没有自己的字段&#xff0c;可以通过Binding绑定到其它对象的属性或者说数据源上&#xff0c;从而获得值。 缘由 由于控件有很多的属性&#xff0c;有属性就有字段的内存开销&#xff0c;但实际上对于一个控件&#xff0c;我们大多数只会使用其部分常用属性&#…

ConvNeXt(CVPR 2022)论文解读

paper&#xff1a;A ConvNet for the 2020s official implementation&#xff1a;https://github.com/facebookresearch/ConvNeXt third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/convnext.py 背景 在…

代码随想录-算法训练营day55【动态规划16:两个字符串的删除操作、编辑距离、编辑距离总结篇】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part16● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇 详细布置 583. 两个字符串的删除操作 本题和动态规划&#xff1a;115.不同的子序列 相比&#xff0c;其实就是两个字符串都…

流量回放平台与传统测试工具的对比分析

文章目录 一、流量回放平台的优势与挑战二、传统测试工具的优势与挑战三、实际案例演示四、解决方案五、答疑解惑5.1、传统工具不是也可以做到流量会放平台的无侵入性测试和性能瓶颈分析吗&#xff1f;5.2、开发流量回放平台的成本和使用传统测试工具的成本哪个更大&#xff1f…

基于SSM框架的垃圾分类系统的设计与实现(含源码+sql+开题报告+论文+论文答辩模板)

图1 前台首页截图 首页展示&#xff1a;首页展示法律法规、公示公告、用户交流论坛、分类指南、垃圾站点、以及个人中心&#xff1b; 法律法规&#xff1a;展示我国《城市生活垃圾分类及其评价标准》以及《生活垃圾分类标志》等最新法律法规&#xff1b; 公示公告&#xff1…

另一棵树的子树(oj题)

一、题目链接 https://leetcode.cn/problems/subtree-of-another-tree/submissions/536304222 二、题目思路 1.首先遍历大树&#xff0c;判断大树的根结点的值是否等于小树的根结点的值&#xff0c;如果不相等&#xff0c;就找大树的左孩子或者右孩子&#xff0c;以左孩子为根…

【线性表 - 数组和矩阵】

数组是一种连续存储线性结构&#xff0c;元素类型相同&#xff0c;大小相等&#xff0c;数组是多维的&#xff0c;通过使用整型索引值来访问他们的元素&#xff0c;数组尺寸不能改变。 知识点数组与矩阵相关题目 # 知识点 数组的优点: 存取速度快 数组的缺点: 事先必须知道…

php 实现:给图片加文字水印,图片水印,压缩图片

演示环境&#xff1a; 1、windows10 2、phpstudy 3、php7.4 一、案例演示&#xff1a; 二、素材准备 1、准备一张原始图片 2、准备一张水印图片&#xff08;透明底图的最好&#xff09; 3、字体库&#xff08;windows系统自带的字体库&#xff0c;路径在&#xff1a;C:\Window…

Navicat连接Oracle

目标&#xff1a; 1.Navicat连接Oracle数据库&#xff0c;报错 无监听程序。 一、下载安装Navicat15 https://zhuanlan.zhihu.com/p/675991635 下载安装资源 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1u1q 二、测试SQL PLUS连接数据库 在全部程序--》Ora…

Python | Leetcode Python题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution:def maxProfit(self, prices: List[int]) -> int:n len(prices)buy1 buy2 -prices[0]sell1 sell2 0for i in range(1, n):buy1 max(buy1, -prices[i])sell1 max(sell1, buy1 prices[i])buy2 max(buy2, sell1 - …

Hadoop+Spark大数据技术 第七次作业

第七次作业 1. 简述Spark SQL使用的数据抽象DataFrame与Dataset的区别。 DataFrame: 基于 Row 对象的二维表格结构&#xff0c;类似于关系型数据库中的表。 行和列都有明确的 Schema&#xff08;模式&#xff09;&#xff0c;可以进行类型推断。 提供了丰富的操作接口&#xff…

行列视(RCV)数据安全如何保障?

行列视&#xff08;RCV&#xff09;的数据安全保障是一项至关重要的任务&#xff0c;涉及多个层面的技术和策略来确保数据的完整性、保密性和可用性。以下是关于RCV数据安全保障的几个方面&#xff1a; 首先&#xff0c;RCV采用了先进的加密技术来保护数据的传输和存储。通过使…

英伟达(NVIDIA)A800性能及应用场景

英伟达&#xff08;NVIDIA&#xff09;A800是一款高性能的人工智能&#xff08;AI&#xff09;加速卡&#xff0c;设计用于满足大规模深度学习、数据分析以及其他高性能计算需求。以下是其主要性能参数及应用概述&#xff1a; 性能参数&#xff1a; 数据传输速率&#xff1a;…

docker私有镜像仓库的搭建及认证

简介&#xff1a; docker私有镜像仓库的搭建及认证 前言 在生产上使用的 Docker 镜像可能包含我们的代码、配置信息等&#xff0c;不想被外部人员获取&#xff0c;只允许内 网的开发人员下载。 Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。在内部网…

苍穹外卖数据可视化

文章目录 1、用户统计2、订单统计3、销量排名Top10 1、用户统计 所谓用户统计&#xff0c;实际上统计的是用户的数量。通过折线图来展示&#xff0c;上面这根蓝色线代表的是用户总量&#xff0c;下边这根绿色线代表的是新增用户数量&#xff0c;是具体到每一天。所以说用户统计…

CS4344国产替代音频DAC数模转换芯片DP7344采样率192kHz

目录 DAC应用简介DP7344简介结构框图DP7344主要特性微信号&#xff1a;dnsj5343参考原理图 应用领域 DAC应用简介 DAC&#xff08;中文&#xff1a;数字模拟转换器&#xff09;是一种将数字信号转换为模拟信号&#xff08;以电流、电压或电荷的形式&#xff09;的设备。电脑对…