如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦
一、问题背景
自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句来查询表或索引的存储方式。那么,具体该如何操作呢?

二、测试表
说明:这里仅列举了部分组合,还有其他的组合应该也是类似的,不再赘述,欢迎测试,拍砖。
-- 行存表,行存索引
create table t1(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t1_c2(c2)) partition by hash(c1) partitions 3;
create table t2(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t2_c2(c2)) partition by hash(c1) partitions 3 with column group(all columns);
create table t3(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t3_c2(c2) with column group(all columns)) partition by hash(c1) partitions 3 with column group(all columns);-- 行存表,纯列存索引
create table t4(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t4_c2(c2) with column group(each column)) partition by hash(c1) partitions 3;-- 行存表,行列混合索引
create table t5(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t5_c2(c2) with column group(each column,all columns)) partition by hash(c1) partitions 3;-- 纯列存表,行存索引
create table t6(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t6_c2(c2) with column group(all columns)) partition by hash(c1) partitions 3 with column group(each column);
create table t7(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t7_c2(c2)) partition by hash(c1) partitions 3 with column group(each column);-- 行列混合表,行列混合索引
create table t8(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t8_c2(c2) with column group(each column,all columns)) partition by hash(c1) partitions 3 with column group(each column,all columns);
三、摸索
从列存相关的语法上可以看出,引入列存后新增加了 with column group (xxx) 的关键字,可以尝试搜一下哪些表的列上涉及了 column_group 相关的字段,从下面的结果看目前并没有标准表或者视图提供这样的信息。
MySQL [oceanbase]> select distinct table_name from __all_virtual_table
where table_id in (select distinct table_id from __all_virtual_column where column_name like '%column_group%');
+--------------------------------------------+
| table_name |
+--------------------------------------------+
| __all_table_history |
| __all_column_group |
| __all_column_group_history |
| __all_column_group_mapping |
| __all_column_group_mapping_history |
| __all_virtual_core_all_table |
| __all_virtual_table |
| __all_virtual_table_history |
| __all_virtual_column_group |
| __all_virtual_column_group_mapping |
| __all_virtual_column_group_history |
| __all_virtual_column_group_mapping_history |
+--------------------------------------------+
12 rows in set (0.97 sec)
从 __all_virtual_column_group 表的 column_group_type 字段,凭感觉可以标识。
MySQL [oceanbase]> desc __all_virtual_column_group;
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| tenant_id | bigint(20) | NO | PRI | NULL | |
| table_id | bigint(20) | NO | PRI | NULL | |
| column_group_id | bigint(20) | NO | PRI | NULL | |
| gmt_create | timestamp(6) | NO | | NULL | |
| gmt_modified | timestamp(6) | NO | | NULL | |
| column_group_name | varchar(389) | NO | | | |
| column_group_type | bigint(20) | NO | | NULL | |
| block_size | bigint(20) | NO | | NULL | |
| compressor_type | bigint(20) | NO | | NULL | |
| row_store_type | bigint(20) | NO | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
10 rows in set (0.02 sec)
从代码 src/share/schema/ob_schema_struct.h 找到 column_group 类型的枚举值。
enum ObColumnGroupType : uint8_t
{DEFAULT_COLUMN_GROUP = 0,ALL_COLUMN_GROUP,ROWKEY_COLUMN_GROUP,SINGLE_COLUMN_GROUP,NORMAL_COLUMN_GROUP,MAX_COLUMN_GROUP
};
四、结论
经过测试发现如何标识 表或者索引是行存/纯列存/行列冗余的方式存储,这里之所以给 "结论"使用引号扩起来,原因:
1、受限于自己测试的 case 可能不完善,存在错误的情况,欢迎一起测试,交流。
2、随着版本的迭代,针对枚举值可能会有调整/比如增删等,应以实际版本中的枚举值为准。
- 某个租户下当同一个 table_id 的 column_group_type 包含3 但是不包含1,输出:纯列存表
- 某个租户下当同一个 table_id 的 column_group_type 包含1 和 3,输出:行列混合表
- 其他情况均输出 :纯行存表
五、查询sql和结果
说明:可以按需调整 tenant_name/database_name
sql_1(混合查询)
select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_name
from __all_virtual_column_group cg
join dba_ob_tenants t1 on cg.tenant_id = t1.tenant_id
join cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_id
left join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_id
where t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')
group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
order by t1.tenant_name,t2.database_name, t2.table_name;
sql1_查询结果
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| test1 | row_column_db | t1 | 596454 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t2 | 596462 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t3 | 596470 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t4 | 596478 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | idx_t1_c2 | 596455 | 596454 | INDEX | 纯行存索引 | t1 |
| test1 | row_column_db | idx_t2_c2 | 596463 | 596462 | INDEX | 纯行存索引 | t2 |
| test1 | row_column_db | idx_t3_c2 | 596471 | 596470 | INDEX | 纯行存索引 | t3 |
| test1 | row_column_db | idx_t4_c2 | 596479 | 596478 | INDEX | 纯列存索引 | t4 |
| test7 | db100 | t8 | 500070 | NULL | USER TABLE | 行列混合表 | NULL |
| test7 | db100 | idx_t8_c2 | 500071 | 500070 | INDEX | 行列混合索引 | t8 |
| test7 | db600 | t5 | 500045 | NULL | USER TABLE | 纯行存表 | NULL |
| test7 | db600 | t6 | 500053 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | t7 | 500061 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | idx_t5_c2 | 500046 | 500045 | INDEX | 行列混合索引 | t5 |
| test7 | db600 | idx_t6_c2 | 500054 | 500053 | INDEX | 纯行存索引 | t6 |
| test7 | db600 | idx_t7_c2 | 500062 | 500061 | INDEX | 纯行存索引 | t7 |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
16 rows in set (3.45 sec)
sql2_查询纯列存的表/索引
select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_name
from __all_virtual_column_group cg
join dba_ob_tenants t1 on cg.tenant_id = t1.tenant_id
join cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_id
left join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_id
where t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')
group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
having(t2.table_type = 'user table' and sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0)or(t2.table_type = 'index' and sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0)
order by t1.tenant_name, t2.database_name, t2.table_name;
sql2_查询结果
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
| test1 | row_column_db | idx_t4_c2 | 596479 | 596478 | INDEX | 纯列存索引 | t4 |
| test7 | db600 | t6 | 500053 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | t7 | 500061 | NULL | USER TABLE | 纯列存表 | NULL |
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
3 rows in set (3.48 sec)
sql3_查询行列冗余的表/索引
SELECT tenant_name,database_name,table_name,table_id,data_table_id,table_type,storage_type,main_table_name
FROM (select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_namefrom __all_virtual_column_group cgjoin dba_ob_tenants t1 on cg.tenant_id = t1.tenant_idjoin cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_idleft join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_idwhere t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
) subquery
WHERE storage_type IN ('行列混合表', '行列混合索引')
ORDER BY tenant_name, database_name, table_name;
sql3_查询结果
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| test7 | db100 | idx_t8_c2 | 500071 | 500070 | INDEX | 行列混合索引 | t8 |
| test7 | db100 | t8 | 500070 | NULL | USER TABLE | 行列混合表 | NULL |
| test7 | db600 | idx_t5_c2 | 500046 | 500045 | INDEX | 行列混合索引 | t5 |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
3 rows in set (3.33 sec)相关文章:
如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦
一、问题背景 自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…...
回归预测 | MATLAB实GRU多输入单输出回归预测
回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…...
【OpenGL/Assimp】渲染模型、半透明材质与封装光源
文章目录 渲染成果Assimp库准备:Mesh类修改:透明贴图使用:光源封装:使用方式在如下测试环境中: 渲染成果 Assimp库准备: 从GitHub拉取源码,根据网络教程,借助CMake生成VS工程项目&a…...
pandas与sql对应关系【帮助sql使用者快速上手pandas】
本页旨在提供一些如何使用pandas执行各种SQL操作的示例,来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...
音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流
通过FFmpeg命令可以将一个媒体文件转推RTP: ffmpeg -re -stream_loop -1 -i input.mp4 -c:v copy -an -f rtp rtp://192.168.0.102:5400 但是通过ffplay尝试播放上述产生的RTP流时会报错:“Unable to receive RTP payload type 96 without an SDP file …...
大语言模型预训练、微调、RLHF
转发,如有侵权,请联系删除: 1.【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF) 2.老婆饼里没有老婆,RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...
vue3后台系统动态路由实现
动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …...
解决idea中无法拖动tab标签页的问题
1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可...
WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)
一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…...
25/1/12 嵌入式笔记 学习esp32
了解了一下位选线和段选线的知识: 位选线: 作用:用于选择数码管的某一位,例如4位数码管的第1位,第2位) 通过控制位选线的电平(高低电平),决定当前哪一位数码管处于激活状…...
【NLP】ELMO、GPT、BERT、BART模型解读及对比分析
文章目录 一、基础知识1.1 Word Embedding(词嵌入)1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…...
go语言学习(数组,切片,字符串)
字符串 如果里面存储的是汉字,那么其实就是存储的是UTF--8编码,所以一个字会对应多个字节.如果想要获取汉字的个数,可以使用rune,来处理unicode字符 length: utf8.RuneCountInString( s) 如果只使用len()获取的是字节的个数, 字符串的功能 1,获取字节长度 len(xx) 2,获取字…...
PM 实战 - 智能药盒PRD + 市场规模分析
写在前面 智能硬件 PRD 实例资源很少,Po下个人作品,假定前提为to Boss需求,目标在于覆盖产品设计核心部分(用户画像Persona、产品逻辑图、产品架构图、软件原型图、硬件低保真设计、用例Use Case、硬件标准)。不是申请…...
SQL刷题快速入门(二)
其他章节:SQL刷题快速入门(一) 承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下…...
hive迁移后修复分区慢,怎么办?
我有1个30TB的分区表,客户给的带宽只有600MB,按照150%的耗时来算,大概要迁移17小时。 使用hive自带的修复分区命令(一般修复分区比迁移时间长一点),可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...
代码随想录算法训练营day27
代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天,希望自己能够坚持下来! 今日任务: ● 贪心算法理论基础 ● 455.…...
python 代码使用 DeepXDE 库实现了一个求解二维非线性偏微分方程(PDE)的功能
import deepxde as dde import numpy as np import matplotlib.pyplot as plt import tensorflow as tf# 设置时空计算域 Lx 1 # x 范围从 0 到 1 Ly 1 # y 范围从 0 到 1 Lt 0.05 # t 范围从 0 到 0.05 geom dde.geometry.Rectangle([0, 0], [Lx, Ly]) # 空间域 timed…...
【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...
VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。
以下是一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源(可以提高安装速度): bash复制代码 npm config set registry https://registry…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
