IvorySQL 5.6 RISC-V 实测:零补丁编译,468 项回归测试全过

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

本文作者:施嘉伟,Oracle ACE Pro、PostgreSQL ACE,IvorySQL 专家顾问委员,微信公众号:Digital Observer。

官方包里没有 riscv64

IvorySQL 5.6 在 2026 年 9 月 18 日发布,内核跟进到 PostgreSQL 18.6。翻一下官方 release 页面的二进制包:

IvorySQL-5.6-74c405c-20260914.aarch64.rpm
IvorySQL-5.6-74c405c-20260914.arm64.deb
IvorySQL-5.6-74c405c-20260917.amd64.deb
IvorySQL-5.6-74c405c-20260917.x86_64.rpm

四个包,x86_64 和 ARM64 各两种格式。没有 riscv64。

RISC-V 上想用 IvorySQL 5.6,只有源码编译一条路。

“能不能编出来"和"编出来跑得对不对"是两个问题。国产化适配的文章我看过不少,很多文章停在"编译通过、能连上、执行了一条 select”。编译通过只证明代码能过编译器,离可用还差得远。新架构上容易出问题的地方在浮点格式化、内存对齐、字节序这些细节,完整的回归测试才能把它们抓出来。

这次的目标很具体:跑完两套回归测试,再确认 Oracle 兼容能力的边界。

测试环境

项目配置
SoC算能 SOPHGO SG2042,双路
CPU128 核,8 个 NUMA node
CPU 核心平头哥玄铁 C920,2GHz
ISArv64imafdc_zicntr_zicsr_zifencei_zihpm_xtheadvector
内存250 GB
存储NVMe SSD 894 GB
操作系统openEuler 24.03 (LTS)
内核6.6.127-0.0.0.0.riscv64
编译器GCC 12.3.1

这台机器 128 核、250G 内存、NVMe,规格和主流 x86 服务器没有代差。RISC-V 服务器已经不是小板子了。

我自己就栽在这个印象上,后面编译那节会讲。

顺带解释一个容易搞混的地方。dmidecode 报出的厂商是 SOPHGO 算能、型号 SG2042,但 /proc/cpuinfo 里的 mvendorid 是 0x5b7(平头哥),ISA 字符串带 xtheadvector,这是平头哥的私有向量扩展。

两者并不矛盾。SG2042 是算能的芯片,CPU 核心使用平头哥的玄铁 C920。芯片厂商和核心设计方是两个角色,mvendorid 报告的是后者。RISC-V 生态把 IP 授权与芯片设计分开,这一点和 ARM 类似。

编译结果:没有架构补丁

拉源码

git clone --depth 1 --branch IvorySQL_5.6 \
    https://github.com/IvorySQL/IvorySQL.git ivorysql-5.6
cd ivorysql-5.6 && git log -1 --format="%H"
# 74c405c9c355a8167322b3749bbc1b982a0eb0c0

74c405c 这个 commit 和官方发布包文件名里的哈希完全一致。我们编译的源码,就是官方 x86/ARM 二进制包所用的同一个提交。

这样后面测到的差异才能归因到架构,而不是版本。适配验证先做这步交叉校验,成本很低。

依赖与 configure

openEuler 上装齐依赖:

dnf install -y gcc gcc-c++ make bison flex perl perl-ExtUtils-Embed \
    readline-devel zlib-devel openssl-devel libicu-devel \
    libxml2-devel libxslt-devel libuuid-devel e2fsprogs-devel \
    systemd-devel python3-devel tcl-devel git wget

configure 参数:

./configure --prefix=/opt/ivorysql5.6 \
    --with-uuid=e2fs --with-libxml --with-libxslt \
    --with-icu --with-openssl --with-readline --with-systemd \
    --without-llvm

这里有两个选择需要说明。

没用 --enable-cassert。IvorySQL 官方 README 的示例是带 --enable-debug --enable-cassert 的,那是给开发调试用的配置,cassert 会让运行时慢三到五倍。适配验证如果带着它,后面所有性能观察都失去参考价值。做正式测试请务必去掉。

加了 --without-llvm。RISC-V 上 LLVM 的 JIT 后端支持度不如 x86/ARM,第一轮适配先把这个变量收敛掉,跑通之后再单独验证 JIT 能不能开。变量一次只引入一个,出了问题才定位得了。

结果是:configure 和 make 都一次通过,没有打补丁。

标准的 ./configure && make && make install 流程直接跑完,编译日志里没有 error。官方虽然不提供 riscv64 包,但这次源码编译没有遇到架构相关的阻碍。

configure 输出里的三行

编译顺利不代表没有信息量。RISC-V 与 x86/ARM 的实质差异,全在 configure 的探测输出里。

第一行,CRC-32C 掉到纯软件实现。

checking for _mm_crc32_u8 and _mm_crc32_u32... no
checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd... no
checking for __builtin_loongarch_crcc_w_b_w, ... no
checking which CRC-32C implementation to use... slicing-by-8

PostgreSQL 18 依次探测了四条硬件加速路径:x86 的 SSE4.2、ARMv8 的 CRC 扩展、ARMv8+SIMD、龙芯的专用内建函数。四条全部落空,回落到 slicing-by-8 查表法。

根因在指令集层面,RISC-V 的标准扩展里没有 CRC 指令。编译时实际启用的指令集字符串是最直接的证据:

-march=rv64imafdc_zicsr_zifencei -mabi=lp64d

拆开看:rv64i 基础整数,m 乘除,a 原子,f 和 d 浮点,c 压缩指令。没有任何 CRC 相关扩展,也没有 B 扩展(Zbc 的 carry-less 乘法本可以加速 CRC,但 PG 没走这条路)。

PostgreSQL 用 CRC-32C 校验每一条 WAL 记录,写入前必算。看到这里很自然会推导出"RISC-V 上写入密集负载会多付一笔账"。

这个推断的方向没错,但量级差得很远。用 perf 实测后,pg_comp_crc32c_sb8 只占 0.14% CPU,SQL 解析函数 base_yyparse 占 1.48%。解析开销约为校验和的十倍。

WAL 记录本身不大,CRC 计算在整个事务处理链路里的权重很小,被解析、规划、锁、缓冲区管理淹没了。指令集缺口的存在性和它的实际权重,是两件事。

第二行,一个容易被误读的 dummy.s。

config.status: linking src/backend/port/tas/dummy.s to src/backend/port/tas.s

RISC-V 没有手写的 test-and-set 汇编,用了 dummy.s 占位。这行很容易被写成"自旋锁没有优化、性能存疑"。

这个推论不成立。前面的四行输出已经给出了原因:

checking for builtin __sync int32/int64 atomic operations... yes
checking for builtin __atomic int32/int64 atomic operations... yes

GCC 的内建原子操作全部可用。PG 的 s_lock.h 在这种情况下走 __sync_lock_test_and_set,而 -march 里的 a 扩展在,GCC 会把它编译成 RISC-V 的 amoswap 原子指令,是真正的硬件原子操作。

dummy.s 只代表没有为这个架构手工写汇编,不代表没有硬件支持。CRC-32C 是指令集真缺,自旋锁是有硬件指令只是没手写汇编,混为一谈就是硬伤。

第三行,IvorySQL 自有代码也在这条链路上。

config.status: linking src/interfaces/libpq/posix_ivysema.c
               to src/interfaces/libpq/ivy_sema.c

这行是原生 PG 没有的,IvorySQL 在 libpq 层加了自己的信号量实现。适配时厂商自有代码往往最容易出问题,这次它顺利过了 POSIX 信号量这条路。

编译并行度和机器规格

第一次编译我按"RISC-V 内存小、每个并行任务预留 1.5G"的经验开了 -j2:

阶段并行参数墙钟usersys实际并行度
核心 backend-j223m06s35m54s6m32s1.84
contrib-j12833.5s4m50s10m50s28.03

并行度算法是 (user + sys) ÷ real。

那 23 分钟只用了这台机器 1.4% 的算力,内存从头到尾没超过 4G。

按嵌入式设备的思路配置编译参数,会低估这类 RISC-V 服务器。先看 nproc 和 free -h,再定并行度。

contrib 阶段还有个现象:sys 时间是 user 的 2.24 倍,内核态占了大头。原因是 contrib 由几十个小模块组成,每个都要 fork gcc、建目录、装文件,高并行下进程创建和文件系统调用密集爆发。这也解释了为什么 -j128 只跑出 28 的并行度,不是机器不行,是模块数和依赖链填不满 128 核。

产物验证

$ file /opt/ivorysql5.6/bin/postgres
ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI,
dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1

RVC 对应 -march 里的 c(压缩指令),double-float ABI 和动态链接器 lp64d 对应 -mabi=lp64d。原生 RISC-V 构建,不是交叉编译。

37 个二进制、52 个扩展 control 文件,齐全。

两套回归测试,468 项全过

编译通过只是起点,回归测试才决定这次适配能不能算"可用"。

IvorySQL 维护着两套平行的测试体系。src/test/regress 是 PostgreSQL 原生测试集,入口 make check;src/oracle_test/regress 是 Oracle 兼容模式测试集,入口 make oracle-check。

两个目录的子目录结构完全一致(authentication、isolation、recovery、subscription、ssl、icu 等),不是加了几个用例,是两套完整体系。顶层 GNUmakefile 里 all-check: check oracle-check 这一行把两个入口并列写了出来。

结果

测试集目标用例数结果耗时
src/test/regressmake check231全过3m18.8s
src/oracle_test/regressmake oracle-check237全过6m01.4s
合计468零失败约 9m20s
# All 231 tests passed.
# All 237 tests passed.

没有产生任何 regression.diffs。

两套测试分别覆盖什么

只跑 make check 的话,结论只能是"PostgreSQL 18.6 在 RISC-V 上跑得对",因为那 231 项全是 PG 原生测试。

IvorySQL 的 Oracle 兼容不是薄层包装,它在 backend 里挂了一套独立实现:

src/backend/oracle_parser     独立的 Oracle 语法解析器
src/oracle_fe_utils           前端工具的 Oracle 分支
contrib/ivorysql_ora          Oracle 兼容扩展本体
contrib/ora_btree_gist        Oracle 数据类型的索引支持
contrib/ora_btree_gin
src/interfaces/libpq/ivytest  libpq 自有实现的测试

这些代码一行都不在 PG 测试集的覆盖范围内。237 项 Oracle 测试零失败,才能说 IvorySQL 自己那套东西在 RISC-V 上也是正确的。

测试列表中的 ora_force_view 对应 Oracle 的强制建视图特性。这个用例说明 Oracle 测试覆盖了语义层,而不只是给 PG 测试换了名字。

适配结果

在这台 RISC-V 服务器上,IvorySQL 5.6 通过了功能正确性验证,没有使用架构补丁。浮点格式化、时间处理、压缩、分区、索引这些项目全部通过。

前面提到的 CRC-32C 缺少硬件指令,影响的是性能路径,和功能正确性是两件事。国产架构的讨论里,"生态不成熟"和"跑不对"经常被混在一起说,这次的测试数据不支持后一种说法。

部署时要分清两个端口

功能全过之后,实际部署踩了两个坑。

双端口对应两套 SQL 解析器

初始化数据库,启动,然后试 Oracle 语法:

-- 连 5432(postgresql.conf 的 port)
create table t_ora(id number(10), name varchar2(50));
ERROR:  type "number" does not exist

select sysdate from dual;
ERROR:  relation "dual" does not exist

number 类型不存在,dual 虚表不存在。在 PG 端口上,这就是一个标准的 PostgreSQL。

换一个端口,同样的语句:

-- 连 1521(ivorysql.conf 的 ivorysql.port)
select 1 from dual;
 ?column?
----------
        1

show port;
 port
------
 5432

正常执行。注意第二条,show port 在 1521 连接上返回的是 5432。两个端口背后是同一个实例、同一份配置、同一份数据。

机制和源码结构对得上。shared_preload_libraries 里预加载了 liboracle_parser,连接进入的端口决定了这个会话使用哪套解析器。走 1521 进来的会话挂 Oracle parser,认识 NUMBER、VARCHAR2、DUAL;走 5432 进来的用 PG 原生 parser,这些一概不认。

同一个数据库实例,两种 SQL 方言,靠端口路由。

这是迁移适配时最容易踩的坑,而且报错信息具有误导性。

设想一个从 Oracle 迁移过来的团队。运维按习惯配了 5432,开发拿着 Oracle 语法的 SQL 连上去,得到的报错是 type “number” does not exist。这个报错会把人引向完全错误的方向,去查扩展装没装、去查 ivorysql_ora 是不是没加载、甚至怀疑编译有问题。

实际上什么都没错,只是连错了端口。

部署 IvorySQL 时,交付文档需要写清两点。第一,Oracle 兼容语法应连接 ivorysql.port(默认 1521),而不是 port(默认 5432)。第二,两个端口共享同一份数据,可以按团队需要分流,存量 Oracle 应用走 1521,新写的 PG 风格应用走 5432。

ivorysql.port 在哪里配置

这个坑是跟着上一个来的。一机多实例时要错开端口,改 port = 5433 之后启动依然失败,1521 也被占着。

然后就卡住了:

$ grep -i port /opt/ivorysql5.6/data/postgresql.conf
64:#port = 5432    # (change requires restart)

整个 postgresql.conf 里只有这一个真正的端口参数,找不到 1521。日志里也不提。

最后是在源码里挖出来的:

src/backend/utils/misc/ivy_guc.c:240:            1521, 1, 65535,
src/backend/utils/misc/ivorysql.conf.sample:11:  #ivorysql.port = 1521

参数名是 ivorysql.port,但它在一个独立的 ivorysql.conf 里。

IvorySQL 把 PG 原生参数放在 postgresql.conf,把扩展参数放在 ivorysql.conf。这个约定如果没有写进部署文档,排查端口问题时就只能翻源码。

ivorysql.conf 的全貌:

#ivorysql.listen_addresses = 'localhost'   # Oracle mode 的监听地址
#ivorysql.port = 1521                      # (change requires restart)

ivorysql.enable_emptystring_to_NULL = 'on'
shared_preload_libraries = 'gb18030_2022, liboracle_parser, ivorysql_ora'
#ivorysql.identifier_case_switch = interchange   # normal/interchange/lowercase

两套监听配置完全对称:

模式监听地址端口配置文件
PostgreSQLlisten_addressesportpostgresql.conf
Oracleivorysql.listen_addressesivorysql.portivorysql.conf

有个细节印证了这个设计。postgresql.conf 里 listen_addresses 的注释被改成了 what IP address(es) of Postgres mode to listen on,原版 PG 没有 Postgres mode 这个限定词。

还有一点,ivorysql.port 处于注释状态却依然监听 1521,因为注释掉就走 GUC 默认值。改它必须取消注释,光改注释行不生效。

Oracle 兼容能力边界

适配跑通之后实测了一轮 Oracle 特性。这部分结论和架构无关,在 x86 上表现一致,但对迁移评估最有用。

已验证的 Oracle 兼容功能

create table t_ora(id number(10), name varchar2(50), created date);
insert into t_ora values(1, 'RISC-V', sysdate);
insert into t_ora values(2, '', sysdate);

select id, name, nvl(name,'IS_NULL') as nvl_test,
       to_char(created,'YYYY-MM-DD HH24:MI:SS') from t_ora;
 id |  name  | nvl_test |     to_char
----+--------+----------+---------------------
 1  | RISC-V | RISC-V   | 2026-09-20 23:48:02
 2  |        | IS_NULL  | 2026-09-20 23:48:02

第二行插入的是空字符串,nvl 返回了 IS_NULL,说明空字符串被当作 NULL。

这对应 ivorysql.enable_emptystring_to_NULL = on,是 Oracle 和 PostgreSQL 最核心的语义差异之一。PG 原生行为下空串和 NULL 是两回事,迁移时这条不对齐,业务逻辑会大面积出错。IvorySQL 默认打开它,方向是对的。

PACKAGE 也通过了测试:

create or replace package pkg_test as
  function add_one(n number) return number;
  procedure say_hello(name varchar2);
end;
/
create or replace package body pkg_test as
  function add_one(n number) return number as
  begin
    return n + 1;
  end;
  procedure say_hello(name varchar2) as
  begin
    raise notice 'hello %', name;
  end;
end;
/

select pkg_test.add_one(41) from dual;
 add_one
---------
      42

call pkg_test.say_hello('RISC-V');
NOTICE:  hello RISC-V

包的声明与实现分离、包内函数、包内过程、/ 终结符,全部通过。

这条对迁移评估的分量最重。PostgreSQL 原生没有 package 这个概念,而 Oracle 存量系统的业务逻辑大量封装在包里。包不支持,迁移基本等于重写;包支持,迁移才谈得上可行。

仍然缺少的 Oracle 特性

select id, rownum from t_ora where rownum <= 2;
ERROR:  "rownum": invalid identifier

select table_name from user_tables;
ERROR:  relation "user_tables" does not exist

select level from dual connect by level <= 3;
ERROR:  syntax error at or near "by"

三个缺口:ROWNUM 伪列、user_tables 等数据字典视图、CONNECT BY 层次查询。

报错措辞的差异反映了两类不同的缺失。ROWNUM 报的是 “rownum”: invalid identifier,这是 Oracle 风格的措辞(对应 ORA-00904),说明 Oracle parser 在工作,只是这个伪列没实现。CONNECT BY 报的是 syntax error,parser 根本不认识这个语法结构,没进文法。

这两类的改造成本不一样。前者是找替代方案(LIMIT、窗口函数),后者要重写查询结构(WITH RECURSIVE)。评估迁移工作量时,值得按这个维度分类统计。

标识符大小写

select CaseTest from (select 1 as CaseTest from dual) x;
 casetest
----------
        1

混合大小写的标识符 CaseTest,输出的列名是全小写。

ivorysql.identifier_case_switch 默认是 interchange,这个模式下未加引号的标识符走 PG 的小写规则,不是 Oracle 的大写规则。

Oracle 里 SELECT CaseTest 得到的列名是 CASETEST,应用层如果按大写取结果集字段,在 IvorySQL 默认配置下会取不到。参数还有 normal 和 lowercase 两个取值,迁移前建议按自己的应用行为选定。

结论

以下结论都来自这一台 SG2042 服务器,换硬件、换内核都需要重新验证。

能编。标准的 configure、make、make install 直接跑通,没有打补丁,编译日志没有 error。官方不提供 riscv64 二进制包,但源码编译没遇到架构相关的阻碍。

跑得对。468 项回归测试零失败(PG 原生 231 加 Oracle 兼容 237),未产生 regression.diffs。

Oracle 兼容可以用。PACKAGE、Oracle 数据类型、DUAL、NVL、DECODE、空串转 NULL 通过;ROWNUM、数据字典视图、CONNECT BY 有缺口。这三个缺口在 x86 上同样存在,属于产品能力边界,与架构无关。

RISC-V 缺少 CRC 硬件指令这件事,实测 pg_comp_crc32c_sb8 只占 0.14% CPU,SQL 解析的开销是它的十倍。缺口确实存在,但在这类负载里的权重很小。

IvorySQL 5.6 在这台 RISC-V 服务器上已经过了"能不能跑"这一关。

完整复现步骤

# 1. 依赖
dnf install -y gcc gcc-c++ make bison flex perl perl-ExtUtils-Embed \
    readline-devel zlib-devel openssl-devel libicu-devel \
    libxml2-devel libxslt-devel libuuid-devel e2fsprogs-devel \
    systemd-devel python3-devel tcl-devel git wget

# 2. 源码
useradd -m ivorysql && su - ivorysql
git clone --depth 1 --branch IvorySQL_5.6 \
    https://github.com/IvorySQL/IvorySQL.git ivorysql-5.6
cd ivorysql-5.6

# 3. 编译(并行度按 nproc 定,别用经验值)
./configure --prefix=/opt/ivorysql5.6 \
    --with-uuid=e2fs --with-libxml --with-libxslt \
    --with-icu --with-openssl --with-readline --with-systemd \
    --without-llvm
make -j$(nproc)
make install && make -j$(nproc) -C contrib install

# 4. 回归测试(两套都要跑)
make check           # PG 原生,231 项
make oracle-check    # Oracle 兼容,237 项

# 5. 初始化与启动
/opt/ivorysql5.6/bin/initdb -D /opt/ivorysql5.6/data \
    -E UTF8 --locale=C -m oracle
/opt/ivorysql5.6/bin/pg_ctl -D /opt/ivorysql5.6/data \
    -l /opt/ivorysql5.6/data/logfile start

# 6. 验证(注意两个端口)
psql -p 5432 -c "select version();"         # PG 模式
psql -p 1521 -c "select sysdate from dual;" # Oracle 模式

一机多实例需要改端口时,两个配置文件都要改:

postgresql.conf:  port = 5433
ivorysql.conf:    ivorysql.port = 1522
极速建站!用1Panel面板一键部署Halo博客的保姆级教程 | 企业官网/个人博客搭建教程 个人博客是一种在互联网上发布自己的文章、图片、视频等内容的平台,通常以文字为主要形式,但也可以包含其他媒体。个人博客的用途非常广泛。它可以用来记录博主的日常生活、分享自己的知识和经验、展示自己的作品和技能,以及交流自己的观点和看法。通过个人博客,博主可以与读者建立联系,分享自己的见解和体验,同时也可以从读者那里获得反馈和建议。 阅读详情

相关推荐

告别U盘!在Ubuntu 22.04上从零搭建PXE网络装机服务器(支持UEFI/Legacy双启动)

本文详细介绍了在Ubuntu 22.04上搭建PXE网络装机服务器的完整流程,支持UEFI/Legacy双启动模式。通过配置DHCP、TFTP和HTTP服务,实现无需U盘的高效批量系统部署,解决传统安装方式的介质依赖、版本控制和时间成本问题,显著提升机房维护和设备部署效率。

weixin_42569329的博客 249

RISC-V基础指令集:比较、跳转和寻址

上半部分处理的是数据怎么算、怎么在内存和寄存器之间搬运数据。下办部分处理的是另外一个维度:数据算出来之后,程序怎么根据结果做决定,以及怎么访问CPU内部那些控制寄存器。指令全称中文作用slt / sltu小于则置位比较两个寄存器,rs1 < rs2 则 rd = 1,否则 rd = 0小于立即数则置位寄存器与常数比较,结果写 0 或 1jal跳转并链接跳到目标地址,同时把返回地址保存在 rdjalr寄存器跳转并链接跳到 rs1 + offset,同时保存返回地址beq。

weixin_43903002的博客 287

高德地图JS API私有化部署实战:从数据爬取到内网集成

本文详细介绍了高德地图JS API私有化部署的完整流程,涵盖从地图瓦片数据爬取、JS API离线化改造到内网项目集成的实战步骤。重点解决了在封闭内网环境中实现地图功能的核心难题,并提供了Vue.js项目中的具体集成代码与调试技巧,帮助开发者在离线环境下构建稳定可靠的地图应用。

weixin_29062255的博客 319

16 倍三角函数加速:MIPS 把机器人关节装进一颗 RISC-V 芯片

这两年谈"物理 AI"的人很多,但真正落到硬件上,最难的不是大模型,而是把 AI 的决策翻译成精准、安全、可预测的物理动作。关节。每个关节必须在空间、重量、功耗和散热的严格约束下,实现平稳且拟人的运动——从肘部到指尖,每一处都是"最后一环"。传统做法是分层堆芯片:一颗跑 AI 推理的 SoC、一颗跑实时控制的 MCU、再来一颗管通信的,通过总线连起来。代价是延迟叠加、链路复杂、功能安全认证碎片化。一颗芯片全包。fill:#333;important;important;fill:none;

嵌入式单片机实验室 332

解决mamba_ssm库安装难题:两种高效方法详解

本文详细解析了mamba_ssm库安装失败的常见原因,并提供了两种高效的解决方案。针对其依赖C++/CUDA扩展编译的特性,文章手把手指导用户通过GitHub克隆源码编译安装,或寻找匹配的预编译Wheel文件直接安装,帮助开发者彻底解决环境配置难题,顺利部署Mamba模型。

weixin_29056865的博客 555

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 118

一颗RISC-V BLE SoC,三种产品定位:PHY6270、PHY6217、PHY6257要怎么选?

如果你的项目需要更大的Flash、更低的射频电流,同时还需要CAN FD、USB多端点、AoA/AoD、Mesh和DMIC等功能,那么PHY6270更适合复杂型BLE终端。而这样可以减少不必要的电量消耗,尤其适合电池供电的无线设备的应用。很多的消费电子产品并不需要特别复杂的定位和语音功能,但对芯片的工作电压、封装尺寸、触摸控制、按键扫描和外围驱动能力都会有比较明确的要求。而对于蓝牙产品开发来说,合适的芯片并不一定就是参数最多的,而是能够满足产品功能,同时兼顾功耗、PCB面积、外围器件和量产成本的芯片。

Cheryl13824368625 387

uniapp - 解决报错 canvasToTempFilePath: fail canvas is empty 画布为空错误,生成海报相册、二维码、条码、裁剪/拼合操作图片报错,加了this还是报错

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,canvasToTempFilePath:失败画布为空,报错,canvasToTempFilePath:failcanvasisempty,不支持2d,还是报错,this,加上this还是报错,vue3没有this怎么办?海报,保存到手机相册,生成二维码,显示条码,图像裁切,图片处理,canvas报错,无法解决,还是fail,依然报错,传了this也不好使,Uniapp小程序,如何解决这个问题

🏆 前端领域优质创作者 4715

RISC-V体系结构-基础指令集

在学具体指令之前,先建立一个认识:一条指令,就是CPU能做的一个“动作”。比如把“两个数加起来”,“从内存读一个树”,“跳到程序另外一个地方”,每一个动作对应一条指令。RISC-V的基础整数指令集叫 RC32I\RV64I(RV是RISC-V,32\64是地址宽度,I是Integer整数)。指令全称中文作用lwLoad Word加载字从内存读 4 字节到寄存器swStore Word存储字把寄存器的 4 字节写入内存lbLoad Byte加载字节从内存读 1 字节,符号扩展。

weixin_43903002的博客 148

【深度学习新浪潮】2025年末AI产业动态:泡沫争议、技术突破与2026投资机会解析

2025年末的AI产业在波动中完成了阶段性调整,技术突破与政策支持构筑了长期成长基石,而结构性分化与风险隐患则要求投资者更加精准地把握机会。2026年作为“风险资产的黄金年”,AI全产业链将持续成为资本聚焦的核心,无论是算力国产化的技术突破,还是应用场景的规模化落地,都有望催生一批优质企业。投资者需立足产业阶段特征,理性看待短期波动,聚焦核心技术与政策红利,方能在AI产业的成长浪潮中把握确定性机会。

专注:太空算力、AI infra、异构调度、大模型成本工程 1810

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 101

ESP32-P4(RISC-V)运行x86 模拟器 + FreeDOS

Tab5PC开源项目是基于ESP32-P4的嵌入式DOS模拟器,可在巴掌大的M5Stack Tab5上运行FreeDOS,支持VGA图形、SoundBlaster16与AdLib音效、SD卡镜像存储及Wi-Fi文件传输,性能相当于1990年代初486电脑。可安装UCDOS+WPS实现中文办公,运行Doom、Wolfenstein等经典DOS游戏,适合教学演示与复古展示。通过烧录固件并配置SD卡,用户可快速体验90年代中文电脑生态,兼具怀旧性与教育价值。

91创客学堂 587

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RISC-V汇编语言与编译流程

前面一直在讨论“指令”和函数调用,但那些指令最终要写进文件,经过一串工具处理,才能变成可以运行的机器码。这章说的是.S的汇编文件,从源码到可执行程序,中间经历了什么?这些伪操作在数据段中分配空间并填入初值。伪操作分配宽度例子含义.byte1字节.byte 0x41写入一个字节2 字节写入一个半字4 字节写入一个字8 字节写入一个双字.ascii不自动补 \0写入字符串,不以 0 结尾自动补 \0写入字符串,以 0 结尾n 字节空白.space 64。

weixin_43903002的博客 265

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

linux学习

sudo make install:组装好的家具(编译好的库文件),原本放在你的临时工作区。坏处是,你的程序体积会变大。于是,他会根据你的计划书,结合你电脑的当前情况(比如装了什么编译器,库在哪),生成一本极度详细的《施工进度表》。很多大牌的第三方库(比如你刚装的 libevent)为了照顾不同的需求,会同时提供动态库(.so)和静态库(.a),但并不是所有库都这样。只有动态库:常见于系统的核心库(比如你系统的底层 C 库),或者一些商业闭源软件(厂商只给你一个黑盒子,不让你直接把代码打包进你的程序)。

d_mail的博客 194

ubuntu 偶发启动失败问题分析

ubuntu 系统启动偶发异常问题分析

平面到立体 195

177.Agent-LangGraph-MCP的构成说明

MCP架构通过MCP主机、客户端与服务器的协同,实现工具、资源与提示词的统一管理。MCP服务器提供Tools、Resources、Prompts能力,MCP客户端则负责发现、调用与读取,使Agent可按需获取上下文。其核心在于将工具从Agent中抽离,封装为可复用的服务,提升灵活性与可维护性,推动AI应用高效协作。

计算机王的博客 289

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 477

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 251

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 302

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 178

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 159

Docker部署linkding:HTTPS与数据备份

部署私人书签库,除了让页面能够打开,还需要考虑几个实际问题:重建容器后数据是否保留、登录和保存是否正常、升级前怎样备份,以及出现 502 或 CSRF 错误时从哪里检查。本文使用 Docker Compose 部署 linkding,采用默认 SQLite 数据库,通过 Caddy 提供 HTTPS,并完成账户创建、数据持久化验证和备份。如果重建后账户或书签消失,应先检查是否换了项目目录、改了挂载路径,或者启动了另一套实例,不要急着重新初始化。遇到权限问题,应根据日志确认具体目录和运行用户,再调整权限。

tedcloud123的博客 170

云计算课程小组PPT汇报任务书

36人分为6组,每组6人;形式:生活案例调研 + 理论解读;汇报时长7‑9min;PPT建议10‑14页。

Michelle8023的博客 208

大表 ALTER TABLE 怎么做?NineData OnlineDDL 配置与执行实践

介绍NineData OnlineDDL大表变更实践,涵盖执行策略、切表控制、拷贝批次与可视化进度追踪。

dbasenewbie的博客 295

软件项目交付时,源代码之外还应该交付哪些技术资料?

软件项目交付时,除可运行程序外,还应核对源代码、数据库结构、接口文档、部署运维、测试验收和账号资产。本文从实际交付环节拆解完整资料清单,并说明合同如何约定交付范围、知识产权与维护边界。

chengduyoushu的博客 306
上一篇: PostgreSQL 日报|逻辑解码 DDL 子事务缺陷修复(10 月 12 日)
下一篇: PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值