MySQL项目迁移华为GaussDB PG模式指南
文章目录
- 0. 前言
- 1. 数据库模式选择(B/PG)
- 2.驱动选择
- 2.1. 使用postgresql驱动
- 2.1. 使用opengaussjdbc驱动
- 3. 其他考虑因素
- 4. PG模式
- 4.1 MySQL和OpenGauss不兼容的语法处理建议
- 4.2 语法差异
- 6. 高斯数据库 PG模式JDBC 使用示例验证
- 6. 参考资料
本章节主要介绍MySQL项目迁移华为GaussDB PG模式指南
0. 前言
本文是关于如何将MySQL项目迁移到华为GaussDB PG模式的详细教程。
背景:在当今的国际形势严峻,很多卡脖子的技术搞得我们国内奋发图强,以华为为代表的国产数据库。在很多国企的系统中已经开始迁移。国产数据库的重要性不言而喻。
本文整理总计了一下从MySQL迁移到华为的GaussDB PG模式。这两种数据库在核心上有很大的不同,因此这个迁移过程可能会遇到一些困难。本文将详细介绍如何进行这种迁移,包括数据迁移,表结构迁移,以及索引、触发器、存储过程和函数的迁移等步骤。无论你是数据库管理员,还是只是想要了解这个过程的人,都可以从本文中获得有用的信息。
1. 数据库模式选择(B/PG)
GaussDB 是华为提供的一种数据库解决方案,它支持多种存储引擎和数据库模式。在 GaussDB 中,B 和 PG 分别是两种不同的数据库模式。
-
B 模式:这通常是基于 GaussDB 自己的原生存储引擎。这种模式可能提供更多的高级特性和优化,特别是针对大规模、高并发的环境。
-
PG 模式:这是基于 PostgreSQL 的模式。如果你的应用或系统已经在使用 PostgreSQL,或者你需要一个与 PostgreSQL 兼容的解决方案,那么这可能是更好的选择。
2.驱动选择
2.1. 使用postgresql驱动
如果使用PG模式,在3.x版本可以直接使用pgSQL的驱动我们项目亲测
在代码中创建连接之前任意位置隐含装载:Class.forName(“org.postgresql.Driver”);
在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest
这些文件都是不同版本的OpenGauss JDBC驱动,用于Java应用程序连接到OpenGauss数据库。
2.1. 使用opengaussjdbc驱动
当使用opengaussjdbc.jar时,上面的Driver类名相应修改为“com.huawei.opengauss.jdbc.Driver”。
| 文件名称 | 说明 | 文件大小 | 最后修改时间 |
|---|---|---|---|
| gsjdbc200.jar | 针对某些版本的Java(如Java 2.0)的OpenGauss JDBC驱动 | 909 kB | 2023/3/27 00:43:23 |
| gsjdbc4.jar | 针对Java 4或更高版本的OpenGauss JDBC驱动 | 896 kB | 2023/3/27 00:43:23 |
| opengaussjdbc.jar | 通用的OpenGauss JDBC驱动 | 909 kB | 2023/3/27 00:43:23 |
3. 其他考虑因素
-
兼容性:
如果你需要与 PostgreSQL 兼容,那么 PG 模式可能是更好的选择。 -
性能需求:
对于特定的高性能或大规模需求,B 模式可能提供更多的优化选项。 -
特性需求:
某些高级功能可能只在特定的模式下可用。 -
团队经验:
如果你的团队有更多的 PostgreSQL 经验,那么 PG 模式可能更适合;反之亦然。 -
迁移和集成:
考虑到数据迁移和系统集成的复杂性和成本,选择一个与现有系统更兼容的模式。 -
成本:
不同的模式可能有不同的成本结构,包括授权费用和运维成本。
项目迁移数据库类型可是一个大工程,在迁移之初一定要做好充分的调研。建议在确定模式之前,进行性能和兼容性测试,以确保你的选择能满足业务和技术需求。
在 GaussDB 的 PG 模式下,虽然它已经做出了很大的努力来实现对 PostgreSQL 的兼容,但仍然可能存在一些与 MySQL 不兼容的情况。如果你在迁移过程中遇到了这样的问题,以下是一些处理建议:
-
了解两种数据库的差异:首先,你需要理解 MySQL 和 OpenGauss(GaussDB 的 PG 模式)在 SQL 语法、数据类型、函数、存储过程等方面的差异。这将帮助你更好地理解迁移过程中可能出现的问题。
-
使用数据库迁移工具:对于大规模的数据库迁移,手动修改 SQL 语句可能并不现实。你可以考虑使用数据库迁移工具,如 AWS DMS(Database Migration Service)或 Azure Database Migration Service,这些工具可以自动处理一些常见的不兼容问题。
-
手动修改 SQL 语句:对于一些特定的不兼容问题,你可能需要手动修改你的 SQL 语句。例如,MySQL 使用
AUTO_INCREMENT在表定义中创建自增字段,而 OpenGauss 使用SERIAL数据类型。对于这样的差异,你需要手动修改你的表定义。 -
修改应用代码:在某些情况下,你可能需要修改你的应用代码来适应新的数据库。例如,如果你的应用依赖于 MySQL 的特定功能(如全文搜索或地理空间查询),你可能需要重新实现这些功能以使用 OpenGauss 的等价功能。
4. PG模式
4.1 MySQL和OpenGauss不兼容的语法处理建议
以下是在GaussDB PG(OpenGauss)和MySQL之间的一些主要的SQL语法不兼容性。这个列表包含了一些主要的不同之处,但并不是全部的不兼容性。在进行迁移之前,建议深入对比和测试以确保兼容性。
| MySQL | OpenGauss | 备注 |
|---|---|---|
AUTO_INCREMENT | SERIAL | 序列生成器 |
SHOW TABLES | \dt | 查看所有表 |
SHOW DATABASES | \l | 查看所有数据库 |
LIMIT n OFFSET m | LIMIT n OFFSET m 或 FETCH FIRST n ROWS ONLY OFFSET m | 分页查询 |
DESCRIBE table or DESC table | \d table | 描述表结构 |
CONCAT(str1, str2, ...) | `str1 | |
SUBSTRING(str, pos, len) | SUBSTRING(str FROM pos FOR len) | 子字符串 |
LENGTH(str) | LENGTH(str)或CHAR_LENGTH(str) | 字符串长度 |
CURDATE() | CURRENT_DATE | 当前日期 |
NOW() | CURRENT_TIMESTAMP | 当前时间 |
RAND() | RANDOM() | 生成随机数 |
IFNULL(exp, replace_exp) | COALESCE(exp, replace_exp) | 判断表达式是否为空 |
ISNULL(exp) | exp IS NULL | 判断表达式是否为空 |
` 作为标识符引用符 | " 作为标识符引用符 | 标识符引用符 |
存储过程使用 BEGIN 和 END | 存储过程使用 $$ | 存储过程定义 |
TRUNCATE TABLE 不可在事务中 | TRUNCATE TABLE 可在事务中 | 清空表数据 |
REPLACE INTO | INSERT ... ON CONFLICT DO UPDATE | 插入冲突更新 |
REGEXP | ~ | 正则表达式搜索 |
CREATE DATABASE 不支持所有者 | CREATE DATABASE 支持所有者 | 创建数据库 |
ENUM 类型 | 无对应,可用 CHECK 约束代替 | 类型不一致 |
SET 类型 | 无对应,可用 ARRAY 类型代替 | 类型不一致 |
YEAR 类型 | 无对应,可用 INTERVAL YEAR 或 DATE 类型代替 | 类型不一致 |
UNSIGNED 类型 | 无对应,需注意数值范围 | 类型不一致 |
ZEROFILL 类型 | 无对应,需在应用层处理 | 类型不一致 |
SHOW CREATE TABLE | pg_dump -t table -s | 查看表创建语句 |
ENGINE = InnoDB | 无对应 | 存储引擎 |
CHARSET = utf8mb4 | ENCODING = UTF8 | 字符集 |
COLLATE = utf8mb4_bin | COLLATE "C" | 排序规则 |
| 分区表 | 分区表 | 分区定义语法不同 |
CREATE USER | CREATE ROLE | 创建用户 |
REVOKE ALL PRIVILEGES | REVOKE ALL | 撤销权限 |
GRANT SELECT ON *.* | GRANT SELECT ON ALL TABLES IN SCHEMA | 授予权限 |
/*!50003 CREATE*/ | CREATE OR REPLACE | 创建或替换 |
LOCK TABLES | LOCK TABLE | 锁表 |
UNLOCK TABLES | COMMIT | 解锁 |
KILL QUERY | CANCEL | 取消查询 |
SHOW PROCESSLIST | SELECT * FROM pg_stat_activity | 查看进程列表 |
LOAD DATA INFILE | COPY | 数据导入 |
SELECT INTO OUTFILE | COPY TO | 数据导出 |
RENAME COLUMN | ALTER COLUMN RENAME | 重命名列 |
RENAME INDEX | ALTER INDEX RENAME | 重命名索引 |
RENAME DATABASE | 无对应 | 重命名数据库 |
ALTER DATABASE 不支持修改所有者 | ALTER DATABASE 支持修改所有者 | 修改数据库所有者 |
ALTER DATABASE 支持修改字符集和排序规则 | ALTER DATABASE 不支持修改字符集和排序规则 | 修改数据库字符集和排序规则 |
ALTER TABLE 支持一次修改多个列 | ALTER TABLE 一次只能修改一个列 | 修改表列 |
ALTER TABLE 支持一次添加多个索引 | ALTER TABLE 一次只能添加一个索引 | 添加表索引 |
ALTER TABLE 支持一次删除多个索引 | ALTER TABLE 一次只能删除一个索引 | 删除表索引 |
ALTER TABLE 支持修改存储引擎 | ALTER TABLE 不支持修改存储引擎 | 修改表存储引擎 |
ALTER TABLE 支持修改字符集和排序规则 | ALTER TABLE 不支持修改字符集和排序规则 | 修改表字符集和排序规则 |
ALTER TABLE 支持修改自增值 | ALTER TABLE 不支持修改自增值 | 修改表自增值 |
4.2 语法差异
| 序号 | 描述 | MySQL | GaussDB PG |
|---|---|---|---|
| 1 | 插入并在存在时更新 | REPLACE INTO 或 INSERT … ON DUPLICATE KEY UPDATE … | INSERT … ON CONFLICT DO UPDATE … |
| 2 | 使用 LIMIT 进行分页查询 | SELECT … LIMIT offset, count | SELECT … LIMIT count OFFSET offset |
| 3 | 单行插入返回插入的 ID | INSERT INTO …; SELECT LAST_INSERT_ID(); | INSERT INTO … RETURNING id; |
| 4 | 单行更新返回更新的行 | UPDATE …; SELECT …; | UPDATE … RETURNING *; |
| 5 | 单行删除返回删除的行 | DELETE …; SELECT …; | DELETE … RETURNING *; |
| 6 | 随机获取一行记录 | SELECT … ORDER BY RAND() LIMIT 1 | SELECT … ORDER BY RANDOM() LIMIT 1 |
| 7 | 索引字段查询优化 | SELECT * FROM table USE INDEX(index) WHERE column = value | SET enable_seqscan TO OFF; SELECT * FROM table WHERE column = value; SET enable_seqscan TO ON; |
| 8 | 使用全文索引搜索 | MATCH(column) AGAINST(‘text’) | to_tsvector(column) @@ to_tsquery(‘text’) |
| 9 | 查询特定范围的行 | SELECT * FROM table LIMIT x, y | SELECT * FROM table LIMIT y OFFSET x |
| 10 | 使用存储过程 | CALL procedure_name() | SELECT * FROM procedure_name() |
| 11 | 事务处理 | START TRANSACTION; COMMIT; ROLLBACK; | BEGIN; COMMIT; ROLLBACK; |
| 12 | 创建临时表 | CREATE TEMPORARY TABLE table_name | CREATE TEMP TABLE table_name |
| 13 | MySQL使用反引号(``)引用表名和列名 | SELECT column FROM table | SELECT “column” FROM “table” |
| 14 | 时间和日期函数 | DATE(), NOW(), YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() | CURRENT_DATE, CURRENT_TIME, DATE_PART(‘year’, column), DATE_PART(‘month’, column), DATE_PART(‘day’, column), DATE_PART(‘hour’, column), DATE_PART(‘minute’, column), DATE_PART(‘second’, column) |
| 15 | 字符串连接函数 | CONCAT(column1, column2) | column1 |
| 16 | 对分组的限制 | SELECT … FROM … GROUP BY … WITH ROLLUP | SELECT … FROM … GROUP BY … ROLLUP(…) |
| 17 | 对NULL的处理 | SELECT IFNULL(column, 0) FROM table | SELECT COALESCE(column, 0) FROM table |
| 18 | 判断是否为空 | SELECT column IS NULL FROM table | SELECT column IS NULL FROM table |
| 19 | 日期加减操作 | SELECT DATE_ADD(date, INTERVAL 1 DAY) FROM table | SELECT date + INTERVAL ‘1 day’ FROM table |
| 20 | 创建自增主键 | CREATE TABLE table (id INT AUTO_INCREMENT, PRIMARY KEY (id)) | CREATE TABLE table (id SERIAL PRIMARY KEY) |
| 21 | 使用正则表达式匹配数据 | SELECT column REGEXP ‘pattern’ FROM table | SELECT column ~ ‘pattern’ FROM table |
| 22 | 计算平均值 | SELECT AVG(column) FROM table | SELECT AVG(column) FROM table |
| 23 | 计算最大值 | SELECT MAX(column) FROM table | SELECT MAX(column) FROM table |
| 24 | 计算最小值 | SELECT MIN(column) FROM table | SELECT MIN(column) FROM table |
| 25 | 计算总和 | SELECT SUM(column) FROM table | SELECT SUM(column) FROM table |
| 26 | 计算记录数 | SELECT COUNT(column) FROM table | SELECT COUNT(column) FROM table |
| 27 | 使用内置数学函数 | SELECT ABS(column), CEIL(column), FLOOR(column), ROUND(column) FROM table | SELECT ABS(column), CEILING(column), FLOOR(column), ROUND(column) FROM table |
| 28 | 使用内置字符串函数 | SELECT CHAR_LENGTH(column), LOWER(column), UPPER(column), REVERSE(column) FROM table | SELECT LENGTH(column), LOWER(column), UPPER(column), REVERSE(column) FROM table |
| 29 | 使用内置日期函数 | SELECT CURRENT_DATE(), CURRENT_TIME(), DATE_FORMAT(date, ‘format’) FROM table | SELECT CURRENT_DATE, CURRENT_TIME, TO_CHAR(date, ‘format’) FROM table |
| 30 | 使用内置转换函数 | SELECT CAST(column AS type) FROM table | SELECT CAST(column AS type) FROM table |
在华为GaussDB PG模式迁移MySQL项目中,这个过程可能会涉及到数据、表结构、索引、触发器、存储过程和函数的迁移。以下是一些具体步骤:
准备工作:
- 确保MySQL和GaussDB PG版本所支持的功能是兼容的。
- 在GaussDB PG创建一个新的数据库来保存迁移过来的数据。
- 确保你的MySQL数据已经被备份。
步骤1: 数据迁移
- 使用mysqldump工具导出MySQL数据库的数据。例如:mysqldump -u [username] -p [password] [database_name] > [dump_file.sql]
- 使用pgloader工具将MySQL数据导入到GaussDB PG中。例如:pgloader mysql://[username]:[password]@localhost/[database_name] postgresql:///new_database
步骤2: 表结构迁移
- 使用MySQL 客户端等工具查看MySQL的表结构。
- 根据MySQL的表结构,在GaussDB PG中创建相应的表结构,也可以在找找其他工具是否可以批量同步生成。
- 请注意,MySQL和GaussDB PG中的数据类型可能是不一样的,所以在创建表结构时,需要做相应的类型转换。
步骤3: 索引、触发器、存储过程和函数的迁移
- 通过SHOW INDEX FROM [table_name]在MySQL中查看索引。
- 在GaussDB PG中创建相应的索引。
- 通过SHOW TRIGGERS在MySQL中查看触发器。
- 在GaussDB PG中创建相应的触发器。
- 使用SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS在MySQL中查看存储过程和函数。
- 在GaussDB PG中创建相应的存储过程和函数。
注意:这些步骤可能需要一些SQL知识,并且在迁移过程中可能会遇到一些问题,比如数据类型不匹配、编码问题等,需要根据实际情况进行调整。
6. 高斯数据库 PG模式JDBC 使用示例验证
高斯数据库(GaussDB)。对于PG模式,可以使用PostgreSQL JDBC驱动来连接。
添加PostgreSQL JDBC驱动的Maven依赖:
<dependencies><!-- PostgreSQL JDBC driver --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.3.1</version> <!-- 这里的版本号根据实际情况更改 --></dependency>
</dependencies>
可以使用以下Java代码来连接到GaussDB并执行查询。如果是使用持久化框架,比如MyBatis 或者MP 或者JPA hbernate 等就不需要手动创建连接。只需要换一下配置中的jdbc连接串
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class Main {public static void main(String[] args) {try {// 加载驱动Class.forName("org.postgresql.Driver");// 连接数据库,注意URL的格式,包括服务器地址、端口、数据库名、SSL和其他参数String url = "jdbc:postgresql://your_server:your_port/your_database?ssl=true&"+ "sslfactory=org.postgresql.ssl.NonValidatingFactory";Connection conn = DriverManager.getConnection(url, "your_user", "your_password");// 创建一个Statement对象并执行SQL查询Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");// 处理查询结果while (rs.next()) {System.out.println(rs.getString("your_column"));}// 关闭连接rs.close();stmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
6. 参考资料
- GaussDB官方文档:https://support.huaweicloud.com/intl/zh-cn/opengauss/index.html
- PostgreSQL JDBC驱动的官方文档:https://www.postgresql.org/
相关文章:
MySQL项目迁移华为GaussDB PG模式指南
文章目录 0. 前言1. 数据库模式选择(B/PG)2.驱动选择2.1. 使用postgresql驱动2.1. 使用opengaussjdbc驱动 3. 其他考虑因素4. PG模式4.1 MySQL和OpenGauss不兼容的语法处理建议4.2 语法差异 6. 高斯数据库 PG模式JDBC 使用示例验证6. 参考资料 本章节主要…...
流处理详解
【今日】 目录 一 Stream接口简介 Optional类 Collectors类 二 数据过滤 1. filter()方法 2.distinct()方法 3.limit()方法 4.skip()方法 三 数据映射 四 数据查找 1. allMatch()方法 2. anyMatch()方法 3. noneMatch()方法 4. findFirst()方法 五 数据收集…...
Qt中XML文件创建及解析
一 环境部署 QT的配置文件中添加xml选项: 二 写入xml文件 头文件:#include <QXmlStreamWriter> bool MyXML::writeToXMLFile() {QString currentTime QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString fileName &…...
【pyqt5界面化工具开发-11】界面化显示检测信息
目录 0x00 前言: 一、布局的设置 二、消息的显示 0x00 前言: 我们在10讲的基础上,需要将其输出到界面上 思路: 1、消息的传递 2、布局的设置 先考虑好消息的传递,再来完善布局 其实先完善布局,再来设置消…...
Batbot电力云平台在智能配电室中的应用
智能配电室管理系统是物联网应用中的底层应用场景,无论是新基建下的智能升级,还是双碳目标下的能源管理,都离不开智能配电运维对传统配电室的智慧改造。Batbot智慧电力(运维)云平台通过对配电室关键电力设备部署传感器…...
链表(详解)
一、链表 1.1、什么是链表 1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。 2、结点包括两个部分:&#x…...
最简单vue获取当前地区天气--高德开放平台实现
目录 前言 一、注册成为高德平台开发者 二、注册天气key 1.点击首页右上角打开控制台 2.创建新应用 三、vue项目使用 1.打开vue项目找到public下的index.html,如果是vue3的话直接在主目录打开index.html文件就行,主要就是打开出口文件 编辑 2.根据高德…...
大数据处理 正则表达式去除特殊字符 提取中文英文数字
在文本处理中,经常会碰到含有特殊字符的字符串。 比如用户昵称, 小红书文案,等等 都包含了大量表情特殊字符。 这些特殊字符串在ETL处理过程中,经常会引起程序报错,导致致命错误,程序崩溃;或者导…...
Python装饰器(decorators)
本文改编自以下文章:Decorators in Python 装饰器是一个很强大的工具,它允许我们很便捷地修改已有函数或者类的功能,我们可以用装饰器把另一个函数包装起来,扩展一些功能而不需要去修改这个函数代码。 预备知识 在Python中&…...
[halcon] 局部图片保存 gen_circle 和 gen_rectangle2 对比 这怕不是bug吧
背景 我想实现一个功能,获取图片中瑕疵的位置,将瑕疵周边的一块区域抠图并保存。 上代码 一开始我代码这么写的: gen_circle (Rectangle, Row[i], Column[i], 256) reduce_domain(Image,Rectangle,GrayEllipse) crop_domain(GrayEllipse,…...
解析msvcp100.dll丢失的原因及修复方法,教你快速解决的方案
msvcp100.dll文件的丢失,其实也是属于dll丢失的其中一种,因为它是dll文件,大家记住,只要是后缀是dll的文件那么它就是dll文件,只要丢失了dll文件,那么其解决的方法都是大同小异的,唯一不同的是&…...
算法:模拟思想算法
文章目录 实现原理算法思路典型例题替换所有问号提莫攻击N字型变换外观序列 总结 本篇总结的是模拟算法 实现原理 模拟算法的实现原理很简单,就是依据题意实现题意的目的即可,考察的是你能不能实现题目题意的代码能力 算法思路 没有很明显的算法思路…...
【base64】JavaScriptuniapp 将图片转为base64并展示
Base64是一种用于编码二进制数据的方法,它将二进制数据转换为文本字符串。它的主要目的是在网络传输或存储过程中,通过将二进制数据转换为可打印字符的形式进行传输 JavaScript 压缩图片 <html><body><script src"https://code.j…...
根据一个List生成另外一个List,修改其中一个,导致另外一个List也在变化
1、两个List复制 SysDic aSysDic new SysDic(); aSysDic.setDkey("1"); aSysDic.setDnote("12"); SysDic bSysDic new SysDic(); bSysDic.setDkey("2"); bSysDic.setDnote("23"); …...
Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置
文章目录 需求分析解决 需求 Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置 分析 在搜寻多种解决方案后,最后总结出 自己的解决方案 方案一,没看懂 var geojsonOptions {clampToGround : true //使数据贴地};var entities;promise Cesium…...
windows系统配置tcp最大连接数
打开注册表 运行->regedit HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目录下 增加一个MaxUserPort(默认值是5000,端口范围是1025至5000)MaxUserPort设置为65534(需重启服务器) 执行dos命令&…...
SQL存储过程中 SET ANSI_NULLS ON 和 SET QUOTED_IDENTIFIER ON的作用和详解
今天在写SQL Server存储过程中遇到的,做个整理归纳 USE [ABInbevDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO实际上,我们在创建存储过程的时候,这几行的代码是会自动创建出来的,那么先解释下两个标准的概念。 两个…...
C语言——程序执行的三大流程
顺序 : 从上向下, 顺序执行代码分支 : 根据条件判断, 决定执行代码的分支循环 : 让特定代码重复的执行...
二级MySQL(十)——单表查询
这里我们只在一个表内查询,用到的是较为简单的SELECT函数形式 1、查询指定的字段: 用到的数据库是之前提到的S、P、SP数据库 S表格用到的总数据: 首先我们查询所有供应商的序号和名字 这时都是独立的,没有关系,我们找…...
机器学习:无监督学习
文章目录 线性学习方法聚类ClusteringKmeansHAC 分布表示降维PCAMatrix FactorizationManifold LearningLLELaplacian Eigenmapst-SEN 线性学习方法 聚类Clustering Kmeans 随机选取K个中心,然后计算每个点与中心的距离,找最近的,然后更新中…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
基于django+vue的健身房管理系统-vue
开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat12开发软件:PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...
