-
我的第一个云上应用:基于华为云开发者空间和GaussDB的极简留言墙**一、 案例简介 **1.1 项目概述本文完整记录了我在华为云开发者空间上,利用其提供的云开发环境和GaussDB数据库,从零开始构建并部署一个Web留言墙应用的全部过程。这是一个非常适合新手的入门项目,可以快速体验到云上开发的全流程。1.2 技术选型云开发环境: 华为云开发者空间 (HCE 2.0),作为本次开发和部署的服务器。后端技术: Node.js + Express 框架,这是一种轻量且高效的JavaScript后端技术栈。数据库: 华为云开发者空间生态版GaussDB,用于存储我们的留言数据。前端技术: 原生 HTML + JavaScript,无需复杂框架,专注于核心功能。二、 准备工作 (对应规则2)2.1 领取云资源根据官方活动指引,我首先进入了华为云开发者空间控制台,成功领取了本次实践所需的“云开发环境”和“生态版GaussDB”资源。2.2 获取GaussDB连接信息为了让我们的应用能连接到数据库,我点击进入GaussDB实例详情页面,找到了关键的连接信息,并记录了下来。内网地址: [ 请在此处填写您自己的内网IP地址,例如: 192.168.0.29 ]端口: [ 请在此处填写您自己的数据库端口,例如: 8000 ]用户名: [ 请在此处填写您的数据库用户名,例如: root ]密码: (创建时设置的密码)**三、 项目开发与部署 **3.1 准备数据库表在开始写代码前,我先使用华为云的DAS(数据管理服务)工具为我的留言墙应用创建了一张数据表。在GaussDB实例列表页,我点击“登录”进入DAS。然后进入“SQL查询”窗口,执行了下面的SQL语句来创建messages表。【代码块】SQLCREATE TABLE messages ( id VARCHAR(36) PRIMARY KEY, username VARCHAR(50) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); 3.2 初始化后端项目接下来,我登录到云开发环境的终端,开始准备后端项目。创建一个项目目录并进入。【代码块】Bashmkdir my-guestbook cd my-guestbook初始化Node.js项目并安装必要的依赖库:express (Web框架), pg (GaussDB驱动), uuid (生成唯一ID), cors (处理跨域)。【代码块】Bashnpm init -y npm install express pg uuid cors3.3 编写后端代码我在项目目录下创建了一个 server.js 文件,并写入了下面全部的后端逻辑。【代码块】JavaScript// 引入依赖 const express = require('express'); const cors = require('cors'); const { Pool } = require('pg'); const { v4: uuidv4 } = require('uuid'); // 创建Express应用 const app = express(); app.use(cors()); // 允许跨域 app.use(express.json()); // 解析JSON请求体 app.use(express.static('public')); // 托管静态文件 // --- 数据库连接配置 --- // !!! 请将这里的配置信息替换为您自己的真实信息 !!! const pool = new Pool({ user: '[ 请在此处填写您的数据库用户名,例如: root ]', host: '[ 请在此处填写您自己的内网IP地址 ]', database: 'postgres', // 通常默认为postgres password: '[ 请在此处填写您自己的数据库密码 ]', port: [ 请在此处填写您的数据库端口,例如: 8000 ], }); // --- API 路由 --- // 获取所有留言 app.get('/api/messages', async (req, res) => { try { const client = await pool.connect(); const result = await client.query('SELECT * FROM messages ORDER BY created_at DESC'); res.json(result.rows); client.release(); } catch (err) { console.error(err); res.status(500).send('Server Error'); } }); // 添加一条新留言 app.post('/api/messages', async (req, res) => { try { const { username, content } = req.body; const newId = uuidv4(); const client = await pool.connect(); const sql = 'INSERT INTO messages (id, username, content) VALUES ($1, $2, $3)'; await client.query(sql, [newId, username, content]); res.status(201).send('Message added'); client.release(); } catch (err) { console.error(err); res.status(500).send('Server Error'); } }); // --- 启动服务器 --- const PORT = 8082; // 使用您云开发环境开放的端口 app.listen(PORT, () => { console.log(`服务器已在 http://localhost:${PORT} 启动`); }); 3.4 编写前端页面为了让用户能和我们的应用交互,我创建了一个 public 文件夹,并在里面创建了一个 index.html 文件。【代码块】HTML<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>云开发留言墙</title> <style> body { font-family: sans-serif; max-width: 600px; margin: auto; padding: 20px; } .form-container { background: #f4f4f4; padding: 15px; border-radius: 5px; margin-bottom: 20px; } .message { border: 1px solid #ccc; padding: 10px; margin-top: 10px; border-radius: 5px; } .message-user { font-weight: bold; } .message-time { font-size: 0.8em; color: #666; } </style> </head> <body> <h1>我的云上留言墙</h1> <div class="form-container"> <input type="text" id="username" placeholder="你的昵称"> <br><br> <textarea id="content" placeholder="说点什么..." rows="4" style="width: 98%;"></textarea> <br><br> <button onclick="postMessage()">发表留言</button> </div> <div id="message-board"></div> <script> const apiUrl = '/api/messages'; // 加载留言 async function loadMessages() { const response = await fetch(apiUrl); const messages = await response.json(); const board = document.getElementById('message-board'); board.innerHTML = ''; for (const msg of messages) { const div = document.createElement('div'); div.className = 'message'; const time = new Date(msg.created_at).toLocaleString(); div.innerHTML = `<div class="message-user">${msg.username}</div><p>${msg.content}</p><div class="message-time">${time}</div>`; board.appendChild(div); } } // 发表留言 async function postMessage() { const username = document.getElementById('username').value; const content = document.getElementById('content').value; await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, content }) }); document.getElementById('content').value = ''; // 清空输入框 loadMessages(); // 重新加载留言 } // 页面首次加载 window.onload = loadMessages; </script> </body> </html> 3.5 启动并测试应用万事俱备,我在云开发环境终端的项目根目录下,执行命令启动了我的Web应用。【代码块】Bashnode server.js四、 最终成果展示应用成功启动后,我通过浏览器访问我的云开发环境公网IP和对应的端口,看到了我的留言墙应用界面。我成功地发表了一条留言,并且留言被正确地显示了出来,这证明我的应用已经完成了端到端构建,前后端与数据库均已成功打通!五、 总结通过本次实践,我成功地在华为云开发者空间上,独立完成了一个Web应用的开发和部署。整个过程非常顺畅,让我对云上开发、Node.js后端以及GaussDB数据库的使用有了更深入的认识。这是一个非常有价值的入门体验。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 https://bbs.huaweicloud.com/forum/thread-0229189398343651003-1-1.html
-
我的第一个云上应用:基于华为云开发者空间和GaussDB的极简留言墙**一、 案例简介 **1.1 项目概述本文完整记录了我在华为云开发者空间上,利用其提供的云开发环境和GaussDB数据库,从零开始构建并部署一个Web留言墙应用的全部过程。这是一个非常适合新手的入门项目,可以快速体验到云上开发的全流程。1.2 技术选型云开发环境: 华为云开发者空间 (HCE 2.0),作为本次开发和部署的服务器。后端技术: Node.js + Express 框架,这是一种轻量且高效的JavaScript后端技术栈。数据库: 华为云开发者空间生态版GaussDB,用于存储我们的留言数据。前端技术: 原生 HTML + JavaScript,无需复杂框架,专注于核心功能。二、 准备工作 (对应规则2)2.1 领取云资源根据官方活动指引,我首先进入了华为云开发者空间控制台,成功领取了本次实践所需的“云开发环境”和“生态版GaussDB”资源。2.2 获取GaussDB连接信息为了让我们的应用能连接到数据库,我点击进入GaussDB实例详情页面,找到了关键的连接信息,并记录了下来。内网地址: [ 请在此处填写您自己的内网IP地址,例如: 192.168.0.29 ]端口: [ 请在此处填写您自己的数据库端口,例如: 8000 ]用户名: [ 请在此处填写您的数据库用户名,例如: root ]密码: (创建时设置的密码)**三、 项目开发与部署 **3.1 准备数据库表在开始写代码前,我先使用华为云的DAS(数据管理服务)工具为我的留言墙应用创建了一张数据表。在GaussDB实例列表页,我点击“登录”进入DAS。然后进入“SQL查询”窗口,执行了下面的SQL语句来创建messages表。【代码块】SQLCREATE TABLE messages ( id VARCHAR(36) PRIMARY KEY, username VARCHAR(50) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); 3.2 初始化后端项目接下来,我登录到云开发环境的终端,开始准备后端项目。创建一个项目目录并进入。【代码块】Bashmkdir my-guestbook cd my-guestbook初始化Node.js项目并安装必要的依赖库:express (Web框架), pg (GaussDB驱动), uuid (生成唯一ID), cors (处理跨域)。【代码块】Bashnpm init -y npm install express pg uuid cors3.3 编写后端代码我在项目目录下创建了一个 server.js 文件,并写入了下面全部的后端逻辑。【代码块】JavaScript// 引入依赖 const express = require('express'); const cors = require('cors'); const { Pool } = require('pg'); const { v4: uuidv4 } = require('uuid'); // 创建Express应用 const app = express(); app.use(cors()); // 允许跨域 app.use(express.json()); // 解析JSON请求体 app.use(express.static('public')); // 托管静态文件 // --- 数据库连接配置 --- // !!! 请将这里的配置信息替换为您自己的真实信息 !!! const pool = new Pool({ user: '[ 请在此处填写您的数据库用户名,例如: root ]', host: '[ 请在此处填写您自己的内网IP地址 ]', database: 'postgres', // 通常默认为postgres password: '[ 请在此处填写您自己的数据库密码 ]', port: [ 请在此处填写您的数据库端口,例如: 8000 ], }); // --- API 路由 --- // 获取所有留言 app.get('/api/messages', async (req, res) => { try { const client = await pool.connect(); const result = await client.query('SELECT * FROM messages ORDER BY created_at DESC'); res.json(result.rows); client.release(); } catch (err) { console.error(err); res.status(500).send('Server Error'); } }); // 添加一条新留言 app.post('/api/messages', async (req, res) => { try { const { username, content } = req.body; const newId = uuidv4(); const client = await pool.connect(); const sql = 'INSERT INTO messages (id, username, content) VALUES ($1, $2, $3)'; await client.query(sql, [newId, username, content]); res.status(201).send('Message added'); client.release(); } catch (err) { console.error(err); res.status(500).send('Server Error'); } }); // --- 启动服务器 --- const PORT = 8082; // 使用您云开发环境开放的端口 app.listen(PORT, () => { console.log(`服务器已在 http://localhost:${PORT} 启动`); }); 3.4 编写前端页面为了让用户能和我们的应用交互,我创建了一个 public 文件夹,并在里面创建了一个 index.html 文件。【代码块】HTML<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>云开发留言墙</title> <style> body { font-family: sans-serif; max-width: 600px; margin: auto; padding: 20px; } .form-container { background: #f4f4f4; padding: 15px; border-radius: 5px; margin-bottom: 20px; } .message { border: 1px solid #ccc; padding: 10px; margin-top: 10px; border-radius: 5px; } .message-user { font-weight: bold; } .message-time { font-size: 0.8em; color: #666; } </style> </head> <body> <h1>我的云上留言墙</h1> <div class="form-container"> <input type="text" id="username" placeholder="你的昵称"> <br><br> <textarea id="content" placeholder="说点什么..." rows="4" style="width: 98%;"></textarea> <br><br> <button onclick="postMessage()">发表留言</button> </div> <div id="message-board"></div> <script> const apiUrl = '/api/messages'; // 加载留言 async function loadMessages() { const response = await fetch(apiUrl); const messages = await response.json(); const board = document.getElementById('message-board'); board.innerHTML = ''; for (const msg of messages) { const div = document.createElement('div'); div.className = 'message'; const time = new Date(msg.created_at).toLocaleString(); div.innerHTML = `<div class="message-user">${msg.username}</div><p>${msg.content}</p><div class="message-time">${time}</div>`; board.appendChild(div); } } // 发表留言 async function postMessage() { const username = document.getElementById('username').value; const content = document.getElementById('content').value; await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, content }) }); document.getElementById('content').value = ''; // 清空输入框 loadMessages(); // 重新加载留言 } // 页面首次加载 window.onload = loadMessages; </script> </body> </html> 3.5 启动并测试应用万事俱备,我在云开发环境终端的项目根目录下,执行命令启动了我的Web应用。【代码块】Bashnode server.js四、 最终成果展示应用成功启动后,我通过浏览器访问我的云开发环境公网IP和对应的端口,看到了我的留言墙应用界面。我成功地发表了一条留言,并且留言被正确地显示了出来,这证明我的应用已经完成了端到端构建,前后端与数据库均已成功打通!五、 总结通过本次实践,我成功地在华为云开发者空间上,独立完成了一个Web应用的开发和部署。整个过程非常顺畅,让我对云上开发、Node.js后端以及GaussDB数据库的使用有了更深入的认识。这是一个非常有价值的入门体验。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 https://bbs.huaweicloud.com/forum/thread-0229189398343651003-1-1.html
-
第一次使用GaussDB的B模式,发现不支持函数IFNULl(),官方文档是支持的,是什么原因呢,有啥排查思路,请各位大佬帮忙看看~数据库版本:GaussDB Kernel 503.1.0.SPC2700 build 7eba2998
-
GaussDB 兼容 Activiti 5.14 需要从数据库兼容性配置、Activiti 配置调整、SQL 语法适配等方面入手,核心是让 Activiti 5.14 的数据库操作(表结构初始化、CRUD、事务等)能在 GaussDB 上正常运行。 一、前提:确认 GaussDB 的兼容性模式Activiti 5.14 原生支持 PostgreSQL、MySQL 等主流数据库,而 GaussDB(尤其是 GaussDB 100/200)通常兼容 PostgreSQL 协议和语法。建议把GaussDB 配置为PostgreSQL 兼容模式(默认可能已开启,可以去通过show server_version;确认兼容的 PostgreSQL 版本),为 Activiti 提供基础兼容性。 二、核心配置步骤1. 调整 Activiti 5.14 的数据库连接配置Activiti 通过activiti.cfg.xml(或 Spring 配置)指定数据库连接信息,需修改为 GaussDB 的连接参数: 替换 JDBC 驱动:使用 GaussDB 的 JDBC 驱动(如com.huawei.gauss200.jdbc.Driver,需根据 GaussDB 版本下载对应驱动包,放入项目依赖)。修改连接串:按 GaussDB 的 JDBC 格式配置(参考之前的连接串配置)。指定数据库类型:告知 Activiti 使用 PostgreSQL 的适配策略(因 GaussDB 兼容 PostgreSQL)。 修改一下activiti.cfg.xml文件 <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- 数据库连接配置 --> <property name="jdbcUrl" value="jdbc:gaussdb://192.168.1.100:8000/activiti_db?currentSchema=activiti" /> <property name="jdbcDriver" value="com.huawei.gauss200.jdbc.Driver" /> <property name="jdbcUsername" value="username" /> <property name="jdbcPassword" value="password" /> <!-- 数据库类型:指定为postgresql(GaussDB兼容PostgreSQL) --> <property name="databaseType" value="postgresql" /> <!-- 初始化策略:自动创建表结构(首次运行时) --> <property name="databaseSchemaUpdate" value="true" /> <!-- 其他配置(如事务、连接池等) --> <property name="transactionManager" ref="transactionManager" /></bean> 2. 适配 Activiti 的表结构初始化语句Activiti 5.14 启动时会自动创建一系列表(如ACT_RE_PROCDEF、ACT_RU_EXECUTION等)自增主键:Activiti 对 PostgreSQL 使用SERIAL类型作为自增主键,GaussDB 兼容SERIAL(本质是integer+ 自增序列),通常无需修改;若出现问题,可替换为BIGSERIAL(对应bigint)。字符集与排序规则:GaussDB 默认字符集可能为UTF8,需确保与 Activiti 表的字符集一致,可在建表时指定ENCODING 'UTF8'。约束与索引:GaussDB 对某些约束(如外键、唯一索引)的语法可能略有差异,若初始化失败,需提取 Activiti 的建表脚本(可从activiti-engine-x.x.x.jar的org/activiti/db/create目录中找到postgresql脚本),手动修改后在 GaussDB 中执行。 比如:调整后的建表语句(我以 ACT_RE_DEPLOYMENT 为例): CREATE TABLE ACT_RE_DEPLOYMENT ( ID_ VARCHAR(64) NOT NULL, NAME_ VARCHAR(255), DEPLOY_TIME_ TIMESTAMP, PRIMARY KEY (ID_)) WITH (ORIENTATION = ROW, COMPRESSION = NO); -- GaussDB的表存储参数 3. 处理 SQL 语法与函数差异Activiti 5.14 的内部 SQL 操作可能依赖 PostgreSQL 的特定函数(如日期函数、字符串处理函数),若 GaussDB 存在兼容差异,需针对性修改: 日期函数:例如 PostgreSQL 的NOW()在 GaussDB 中可直接使用(兼容);若涉及DATE_PART等函数,GaussDB 通常也支持,无需修改。字符串函数:如SUBSTRING、CONCAT等函数在 GaussDB 中与 PostgreSQL 兼容,一般无需调整。分页语法:Activiti 使用LIMIT ? OFFSET ?进行分页,GaussDB 完全支持该语法,无需修改。 若出现特定 SQL 报错,可通过以下方式解决: 开启 Activiti 的 SQL 日志(<property name="jpaHandleTransaction" value="true" /> + 日志级别DEBUG),定位报错 SQL。自定义 Activiti 的SqlSession,替换兼容 GaussDB 的 SQL 语句(需继承org.activiti.engine.impl.db.DbSqlSession并重写对应方法)。4. 事务与连接池适配事务隔离级别:GaussDB 支持常见的事务隔离级别(如READ COMMITTED),与 Activiti 默认要求一致,无需额外配置。连接池配置:若使用 Druid、Hikari 等连接池,需确保连接池参数适配 GaussDB(如maxPoolSize、idleTimeout),避免连接超时或资源耗尽。 比如(Druid 连接池配置): <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="jdbc:gaussdb://192.168.1.100:8000/activiti_db" /> <property name="driverClassName" value="com.huawei.gauss200.jdbc.Driver" /> <property name="username" value="username" /> <property name="password" value="password" /> <property name="maxActive" value="20" /> <property name="minIdle" value="5" /> <property name="validationQuery" value="SELECT 1" /> <!-- GaussDB支持的验证语句 --></bean> 三、测试和验证一下表结构初始化:启动 Activiti 引擎,检查是否成功创建所有表(共 23 张左右,前缀为ACT_)。流程部署:部署一个简单的 BPMN 流程,验证ACT_RE_PROCDEF、ACT_GE_BYTEARRAY等表是否正确插入数据。流程运行:启动流程实例,检查ACT_RU_EXECUTION、ACT_RU_TASK等运行时表是否正常记录数据,任务完成后是否正确更新到历史表(ACT_HI_*)。异常场景:模拟流程中断、并发操作,验证事务回滚和数据一致性是否正常。 四、常见的问题和一些简单的解决方法推荐问题 1:如果表创建失败,提示 “不支持的类型 SERIAL”解决:将建表语句中的SERIAL替换为BIGINT+ 手动创建序列(如CREATE SEQUENCE ACT_GE_PROPERTY_SEQ START WITH 1 INCREMENT BY 1),并在插入时使用nextval('序列名')。问题 2:如果SQL 报错 “函数 xxx 不存在”解决:确认 GaussDB 是否支持该函数,若不支持,修改 Activiti 的 SQL 脚本,替换为 GaussDB 兼容的函数(如用SUBSTR替代SUBSTRING,视具体情况而定)。问题 3:如果连接超时或频繁断开解决:调整 GaussDB 的idle_in_transaction_session_timeout参数,或在连接池配置中增加validationQuery定期验证连接。 总结一下下GaussDB 兼容 Activiti 5.14 的核心是利用其 PostgreSQL 兼容性,通过调整连接配置、适配表结构和 SQL 语法,确保 Activiti 的数据库操作在 GaussDB 上正常执行。实际操作中需结合具体报错信息逐步调试,重点关注表初始化、SQL 函数和事务处理三个环节。
-
求助各位大佬,第一次使用gaussDB数据库的mysql兼容模式B模式,发现不支持函数IFNULl(),但是看官方文档是支持的
-
gaussdb版本是8115数据库是GBK编码如何检测库内中文表名和中文字段名?
-
华为云GaussDB的存算分离架构通过解耦计算与存储资源,实现高效的弹性扩展。 一、存算分离架构下的弹性扩展机制1. 架构设计原理分层解耦:计算层(无状态):负责SQL解析、事务处理等,可动态增减节点。存储层(分布式存储GaussOS):数据多副本(默认3副本)持久化,独立扩容存储空间。资源池化:基于Kubernetes容器化调度,计算与存储资源独立分配,支持分钟级扩缩容。2. 弹性扩展实现方式计算层扩展:横向扩容(Scale Out):增加计算节点,新节点自动注册到集群,负载均衡器动态分配请求。示例:从16节点扩展到32节点,事务吞吐量线性提升(理论扩展比0.7以上)。纵向扩容(Scale Up):升级单节点配置(如CPU/内存),需短暂停机。存储层扩展:存储空间按需独立扩容,无需联动计算节点(如从10TB扩容到100TB)。支持秒级存储扩容,通过调整存储池容量上限实现。多模态负载隔离:通过逻辑集群(Virtual Warehouse)实现多业务负载隔离,不同业务按需分配计算资源,数据实时共享。3. 在线扩容技术数据重分布:扩容时自动触发数据分片迁移(Rebalance),通过分布式事务保证一致性,业务无感知。无锁设计:在线扩容期间支持读写操作(仅短时阻塞DDL),避免业务中断。二、自动扩缩容的触发条件自动扩缩容基于实时监控与预测算法,主要触发场景如下:触发类型监控指标阈值/策略动作资源瓶颈CPU/内存使用率>80%持续5分钟自动增加计算节点存储容量不足磁盘使用率>85%存储空间自动扩容并发压力连接数/查询队列堆积连接数达上限或队列积压超时横向扩展计算节点业务预测历史负载时序分析(LSTM模型)大促前流量预测(如电商节日)提前预扩容资源性能下降查询延迟(P99)超过基线50%动态分配OLAP/OLTP资源 三、最佳实践与案例金融核心系统:邮储银行采用GaussDB存算分离架构,支撑日均20亿笔交易,突发流量下自动扩容至128节点,RPO=0(零数据丢失)。物联网时序处理:智慧港口场景中,存储层独立扩容至PB级,计算节点按设备增量分钟级扩展,写入延迟<200ms。Serverless模式:开启Serverless后,系统根据SQL查询负载自动切换行存/列存格式,资源利用率提升40%,成本降低30%。四、注意事项版本兼容性:扩容节点需与集群版本一致,跨版本需先升级。业务影响:离线扩容时集群短暂只读,建议选择在线模式。成本优化:结合自动缩容(业务低谷期释放资源),避免过度扩容。总结一下:GaussDB通过存算分离架构,实现计算与存储资源的独立弹性扩展,而自动扩缩容由实时监控+AI预测驱动,覆盖资源瓶颈、容量预警、业务规划等场景,确保高性能与高性价比的平衡。
-
体验华为开发者空间GaussDB的实践案例,反馈改进建议,请直接在评论区反馈即可体验指导:cid:link_0,更多华为开发者空间GaussDB案例也可在此贴反馈。
-
残差网络(Residual Network,ResNet)是卷积神经网络(CNN)领域里程碑式的架构创新,由何恺明(Kaiming He)等人于2015年提出。其核心目标是通过残差学习(Residual Learning)解决深度网络训练中的退化问题(Degradation Problem),即当网络层数增加时,性能不升反降的现象,而梯度消失正是退化问题的主因之一。 传统深度神经网络直接学习目标映射函数 H(x) = y(例如输入图像到分类标签的映射)。但当网络过深时,优化 H(x) 变得困难,梯度在反向传播中逐层衰减(梯度消失)或爆炸,导致深层参数难以更新。ResNet创新性地引入残差映射:定义残差函数 F(x) = H(x) - x,目标变为学习 F(x);输出改写为 H(x) = F(x) + x,其中 x 是输入,F(x) 是卷积层堆叠的变换。关键优势:恒等映射的简易性:若当前层无需复杂变换(即 H(x) = x 最优),则学习 F(x) = 0 比直接学习 H(x) = x 更易实现;梯度传播的捷径:跳跃连接(Skip Connection)使输入 x 直连输出层,反向传播时梯度可绕过中间层直接传递,避免因链式法则导致梯度逐层衰减。 二、结构设计:残差块与网络架构ResNet通过堆叠残差块(Residual Block)构建深层网络,分为两种类型:基本残差块(用于浅层网络如ResNet-18/34)结构:两个3×3卷积层 + 跳跃连接公式:y = F(x) + x,其中 F(x) 为两层卷积操作。瓶颈残差块(用于深层网络如ResNet-50/101/152)结构:1×1卷积(降维)→ 3×3卷积(特征提取)→ 1×1卷积(升维)目的:减少参数量,提升计算效率。 经典ResNet架构对比网络版本残差块类型深度(层数)参数量适用场景ResNet-18基本残差块1811M轻量级任务,移动端ResNet-34基本残差块3421M中等复杂度任务ResNet-50瓶颈残差块5025M主流图像任务ResNet-101瓶颈残差块10144M高精度检测/分割ResNet-152瓶颈残差块15260M极致精度需求任务注:深度包含卷积层、池化层和全连接层。 三、解决梯度消失的机制:前向与反向传播分析1. 前向传播:信息无损传递跳跃连接保留原始输入信息,确保深层网络至少不弱于浅层网络(恒等映射保障);即使中间层 F(x) 学习效果差,输出 y = F(x) + x 仍包含 x 的有效信息。2. 反向传播:梯度直达通道设损失函数为 L,反向传播至残差块输出时,梯度计算为:∂L/∂x = ∂L/∂y * (∂F(x)/∂x + 1)关键点:+1 项确保梯度至少以1的系数传递至前层,避免梯度消失(传统链式法则中梯度可能因连续乘法趋近0)。✅ 实验验证:ResNet-152在ImageNet上训练时,梯度在152层中仍稳定传播,而传统网络(如VGG-19)在30层后梯度已显著衰减。 四、应用与演进核心任务:图像分类(ImageNet冠军)、目标检测(Faster R-CNN、Mask R-CNN)、图像分割、医学影像分析;架构演进:与注意力机制结合(如ResNet + SE-Net),通过通道加权增强特征表达;轻量化设计(如MobileNet-V2引入倒残差块),适配移动端部署。 五、总结:ResNet的意义ResNet通过残差学习和跳跃连接,解决了深度神经网络的梯度消失与退化问题,使训练百层以上网络成为可能。其设计核心在于:学习残差 F(x) 而非直接映射 H(x),降低优化难度;跳跃连接构建梯度传播捷径,保障深层网络参数有效更新;模块化残差块支持灵活扩展,推动CV领域向超深网络演进。何恺明团队凭借ResNet获得2016年CVPR最佳论文,其思想已被Transformer等架构借鉴,成为深度学习基石之一。
-
一、自动化工具辅助迁移SQLShift:异构存储过程智能转换核心能力:SQL Server → GaussDB:支持 T-SQL 到 PL/pgSQL 的精准转换,覆盖 300+ 语法点(如临时表、系统函数、数据类型)。示例:SELECT ... INTO #temp → CREATE TEMP TABLE ... AS非标语法修复:自动重构表别名作用域(如 UPDATE a SET ... FROM tableA a → UPDATE tableA a SET ...)。Oracle → GaussDB:通过 PL/SQL 到 PL/pgSQL 转换(需间接利用 PostgreSQL 兼容性),支持函数定义、事务控制等重构。批量处理:单次支持上百个存储过程转换,自动识别兼容性风险并生成报告。华为 DRS(Data Replication Service):负责数据全量+增量迁移,但不处理存储过程逻辑,需与 SQLShift 配合使用。支持实时同步期间的业务验证,减少停机时间。 二、手动调整与适配关键点即使使用工具,仍需人工干预以下场景:语法差异深度适配:Oracle 特有语法:ROWNUM → ROW_NUMBER() OVER()CONNECT BY → WITH RECURSIVESQL Server 特性:@@IDENTITY → LASTVAL()游标逻辑需改写为 GaussDB 的 FOR ... IN 循环。函数与错误处理重构:函数替换:SYSDATE → CURRENT_TIMESTAMP,NVL() → COALESCE()。异常处理:Oracle 的 PRAGMA EXCEPTION_INIT 需转为 GaussDB 的 EXCEPTION WHEN ... 块。分布式事务优化:GaussDB 的分布式架构需避免跨节点事务锁竞争,例如将 SELECT ... FOR UPDATE 替换为 SKIP LOCKED。手动适配关键语法:-- Oracle PL/SQL → GaussDB SQL示例 -- 1. 游标处理 -- Oracle DECLARE CURSOR c_emp IS SELECT empno, ename FROM emp; v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_empno, v_ename; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename); END LOOP; CLOSE c_emp; END; -- GaussDB适配 DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT empno, ename FROM emp LOOP RAISE INFO '% %', rec.empno, rec.ename; END LOOP; END $$; -- 2. 异常处理 -- Oracle BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20001, '员工不存在'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM); END; -- GaussDB适配 DO $$ BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF NOT FOUND THEN RAISE EXCEPTION '员工不存在'; END IF; EXCEPTION WHEN OTHERS THEN RAISE INFO '错误: %', SQLERRM; END $$; 三、迁移全流程最佳实践评估与规划:兼容性扫描:使用 SQLShift 预检存储过程,标记不兼容对象(如示例中 SP_TSA_WAR 被标记为不兼容)。首先需要评估现有存储过程的迁移难度,识别兼容性问题: #存储过程语法差异分析工具(伪代码) def analyze_procedures(source_db_type, procedure_files): compatibility_map = { 'oracle': { 'plsql_syntax': ['ROWNUM', 'START WITH CONNECT BY', 'PACKAGE BODY'], 'functions': ['TO_CHAR', 'NVL', 'DECODE'], 'datatypes': ['NUMBER', 'VARCHAR2', 'DATE'] }, 'sqlserver': { 't_sql_syntax': ['BEGIN TRANSACTION', 'RAISERROR', '@@ROWCOUNT'], 'functions': ['GETDATE()', 'ISNULL', 'LEN'], 'datatypes': ['INT', 'VARCHAR', 'DATETIME'] } } issues = [] for file in procedure_files: content = open(file, 'r').read() for feature, patterns in compatibility_map[source_db_type].items(): for pattern in patterns: if pattern in content: issues.append(f"发现不兼容语法:{pattern}") return issues issues = analyze_procedures('oracle', ['procedure1.sql', 'procedure2.sql']) print(issues)关键差异点包括:语法差异:PL/SQL vs. SQL Server T-SQL vs. GaussDB SQL数据类型映射:如NUMBER→DECIMAL,VARCHAR2→VARCHAR函数替换:如TO_DATE→TO_TIMESTAMP系统变量:如ROWNUM→ROW_NUMBER()事务处理:如COMMIT WORK→COMMIT版本适配:明确 GaussDB 版本限制(如 V2.0-3.x 不支持 uuid_generate_v4())。分阶段迁移:建议采用 "先数据后逻辑" 的策略:数据模型迁移使用 GaussDB Migration Toolkit 进行表结构迁移处理外键、索引、约束的差异存储过程转换优先迁移基础功能的存储过程采用 "翻译 + 适配" 的方式处理复杂逻辑增量迁移验证灰度发布部分业务,对比迁移前后结果使用数据比对工具验证数据一致性 测试与验证:数据一致性:通过 DRS 校验全表记录数及关键字段抽样。性能压测:使用 TPC-C/TPC-H 对比迁移前后 TPS 及响应延迟。使用 Git 管理存储过程代码,建立版本控制编写自动化测试脚本,确保每次变更的质量设计回滚方案,在出现问题时能快速恢复# 自动化测试脚本 #!/bin/bash # 1. 执行迁移脚本 psql -U username -d dbname -f migrate_procedures.sql # 2. 运行测试用例 psql -U username -d dbname -f test_cases.sql > test_results.txt # 3. 检查测试结果 if grep -q "FAILED" test_results.txt; then echo "测试失败,开始回滚..." psql -U username -d dbname -f rollback_script.sql exit 1 else echo "所有测试通过" exit 0 fi 四、常见风险与规避策略临时表堆积:工具自动将 ON COMMIT DROP 重构为显式清理链(DELETE ROWS + DROP),避免内存溢出。业务逻辑断裂:如 SQL Server 的 NEWID() 无直接等价函数时,工具建议重构为应用层生成 UUID。事务中断:自动标记需外部控制的 COMMIT 语句,防止存储过程内提交导致连接终止。 总结优先使用 SQLShift 实现 70%-90% 的自动化转换,结合 DRS 保障数据同步。人工重点攻关:分布式事务、递归查询、非标函数等复杂逻辑。分阶段验证:从非核心业务到关键系统逐步推进,通过灰度发布控制风险。参考 华为 DRS 迁移指南 部署数据同步。
-
国产化替代,少不了从 Oracle SQL Server 等传统关系型数据库向国产化数据库(如 GaussDB)进行迁移。但是存储过程的改写需要理解复杂的业务逻辑,并熟悉两种数据库之间的语法差异。大多数情况是由 DBA 专家配合业务开发手动改写?这个过程会很缓慢,2025 年 AI 已经极大的发展,有没有更方便好用的方法或工具?
-
购买了云数据库GaussDB集中式版, 通过官网的开发指南了解到可以通过SSL连接云数据库,产品页面也可以下载证书。 但是找不到如何配置服务端SSL。 云数据库默认已经开启SSL了吗? 还是需要登录云数据库所在的服务器进行配置? 能否提供一个官方指导和说明?
-
执行如下SQL语句:SELECT 1 FROM ONLY BasicEntityTest x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x报错: For Key Share and For No Key Update is not support for ustore.错误提示语法有问题,建议: The USTORE storage engine does not support For Key Share and For No Key Update.参考: cid:link_0
-
三权分立模式下系统管理员权限限制解析1. 三权分立的核心逻辑三权分立是将传统系统管理员权限拆分为三类独立角色:系统管理员(System Admin):负责基础设施管理(如创建实例、分配资源)。安全管理员(Security Admin):负责权限与审计管理(如用户创建、审计策略配置)。数据库管理员(Database Admin):负责数据操作(如表创建、数据读写)。2. 常见问题选项描述正确性原因解析系统管理员不再具有OPRADMIN权限正确OPRADMIN权限通常用于操作管理(如备份、恢复),三权分立后划归安全管理员或数据库管理员。系统管理员不再具有CREATEROLE权限正确CREATEROLE(创建角色)属于安全管理范畴,三权分立后由安全管理员负责。系统管理员不再具有AUDITADMIN权限正确AUDITADMIN(审计管理)属于安全控制权限,三权分立后从系统管理员权限中剥离。系统管理员只有对自己作为所有者的对象有权限错误系统管理员仍保留基础的系统资源管理权限(如实例监控、存储分配),并非仅局限于“自己创建的对象”。对象权限(如表读写)由数据库管理员负责。3. 三权分立前后权限对比权限类型传统单管理员模式三权分立模式系统资源管理系统管理员全量拥有系统管理员保留(如服务器配置、实例启动)安全与审计系统管理员全量拥有安全管理员负责(用户创建、审计策略)数据操作权限系统管理员全量拥有数据库管理员负责(表创建、数据读写)角色与权限管理系统管理员全量拥有安全管理员负责(角色创建、权限分配)4. 常见的错误混淆点“系统管理员只有对自己作为所有者的对象有权限”这一描述错误,原因在于:对象权限与系统权限的区分:系统管理员的核心职责是管理底层基础设施(如硬件、实例),而非数据对象(如表、视图)。数据对象权限由数据库管理员分配,与“对象所有者”无关。最小权限原则的应用:三权分立限制的是“跨领域权限”(如系统管理员不能管理审计),但未完全剥夺其系统层面的管理权限。总结三权分立的核心是通过权限拆分实现“权责分离”,系统管理员的权限被限制在基础设施管理范畴,而安全、审计、数据操作等权限被剥离给其他角色。常见的说法:“系统管理员只有对自己作为所有者的对象有权限”是错误的,因为系统管理员的权限范围不局限于对象所有权,而是保留系统级管理职责。
-
【问题来源】汉口银行AICC项目【问题摘要】客户开发坐席系统java代码需要调用平台gaussdb数据库,通过sql语句查询gaussdb获取一些话单数据,请问有相关的代码工程示例吗?【AICC解决方案版本】AICC: 22.200.0Gaussdb :ITInfra_2.2.0_GaussDBT1.5.0客户座席系统开发语言:Java【期望解决时间】2025年6月24日
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第三期2026/08/21 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;念擎-华为云AI开发者运营案例开发专家
本期直播内容:AI六层能力首次详细解读 + 新一代华为云开发者空间亮相 + 校园案例直播带练
即将直播
热门标签