OceanBase v4.2特性解析:Oracle 的XML Type兼容

概述:在OceanBase 的Oracle模式支持XMLType特性后,OceanBase拥有了XML的数据存储、计算、分析能力。用户无需将XML数据作为文本存储,在业务代码中解析并操作XML文本,而是可以直接基于XML内置的能力,对XML数据进行存储、构造、增删改查。

1. 背景

1.1. XML的能力与应用场景

在数据库的描述配置、数据交换等场景中,XML(Extensible Markup Language)的身影屡见不鲜。这种数据交换格式基于文本,具有自解释性且标准化。因为企业用户的数据资产往往储存在关系数据库中,以二维表的形式进行逻辑存储,故而在数据传输与存储交换过程中,通常会产生以下需求:

  • 从关系数据库中查询的一个数据集合,转换为一个XML文档。
  • 提取XML文档的内容,以关系表的方式存储进数据库。
  • 直接在关系数据库中存储、处理XML文档。

同时,在此过程中,XML展现了它的五项能力。

能力1:数据组织结构

XML将数据按照树形结构组织,通过这种嵌套结构,XML可以存储非常大的数据集。

能力2:约束

XML提供两种约束方式,

  • 直接在单个XML文档中定义的约束称为DTD
  • 通过定义XSchema,来描述一系列XML文档的组织以及数据特征,其中Schema也是基于XML标准定义的一种特殊的XML文档。

能力3:查询。

最简单的Xpath类似于我们的文件路径,是访问树形结构最普遍的一种方式。XML标准赋予XPath更强大的能力,比如谓词过滤、基于函数的计算处理、复杂的查询等能力。

能力4:DML

XML标准定义了一系列DOM(The W3C Document Object Model)接口,提供了一套通用、跨平台的方法用于Get/Change/Add/Delete XML

能力5:XQuery

这是XML特有的一种操作语言,有点类似数据库的PL。其能力不仅仅是"Query",也提供了对XML的DML操作,以及复杂的流程控制能力(比如循环、赋值、条件语句、跳转、排序、过滤等)。

1.2. OceanBase v4.2 XML Type特性支持

上述可见,XML涉及的能力非常多。它的标准也非常复杂。正因此,在OceanBase 4.2版本发布的Oracle XML兼容性特性无法做到非常齐全,暂只包括以下四个特性。

特性1:XMLType支持

用户可以定义数据为XML类型,通过PL或SQL操作XML数据。

特性2:基础函数

主要用于XML数据的构造/增删改查。

  • 构造:通过构造函数,可以将关系数据库中的数据集合,转换为XML。比如XMLParse、XMLElement、XMLAttributes、XMLAgg等函数。
  • 查询:查询函数支持基于Xpath的查询, 比如Extract。
  • 更新:通过更新函数可以对XML文档做增量修改,改变某个XML节点的数据,比如UpdateXML。
  • 格式转换:将数据库存储的XML数据格式转换为标准的XML文本,比如XMLSERIALIZE。

特性3:存储

支持原生的XML Binary存储,这是一种查询友好的XML存储格式,相较直接基于文本存储,会避免XML文档的解析,也会加速XML的查询。

特性4:索引

基于虚拟生成列可以在XML文档上建立索引。

部分XML标准以及Oracle XML的功能点不在OceanBase 4.2版本发布的范围内,比如:

  • XQuery
  • XMLDOM
  • XML Package

1.3. 基于数据库能力处理XML

在OceanBase 的Oracle模式支持XMLType特性后,OceanBase拥有了XML的数据存储、计算、分析能力。用户无需将XML数据作为文本存储,在业务代码中解析并操作XML文本,而是可以直接基于XML内置的能力,对XML数据进行存储、构造、增删改查。

基于数据库能力处理XML的优势在于三点。

第一,增量查询/更新。数据库精确返回、修改用户需要操作的XML子节点数据,避免客户端和数据库交换完整XML数据,降低网络开销。

第二,查询优化。基于文本处理XML,每次都需要对XML进行解析,有比较大的解析开销。基于XMLType存储的XML数据只需在入库的时候解析一次,后续查询均不用解析,而且存储格式对查询做了特殊优化。

第三,"想要即所得"。数据库内置了关系数据向XML的相互转换能力,只用简单的SQL即可基于数据库中的数据构造复杂的XML文档,客户端不用基于数据库数据做二次处理。

可以说,OceanBase 4.2版本基于XML基础能力的组合,可以满足绝大部分XML的数据处理场景,"麻雀虽小五脏俱全"。

2. 使用操作

2.1. 创建含有XmlType列的表

# 创建含有xmltype列的表
OceanBase(SYS@SYS)>create table xml_t(id number, c1 xmltype);
Query OK, 0 rows affected (0.522 sec)OceanBase(SYS@SYS)>desc xml_t;
+-------+---------+------+-----+---------+-------+
| FIELD | TYPE    | NULL | KEY | DEFAULT | EXTRA |
+-------+---------+------+-----+---------+-------+
| ID    | NUMBER  | YES  | NULL | NULL    | NULL  |
| C1    | XMLTYPE | YES  | NULL | NULL    | NULL  |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.079 sec)

2.2. XmlType的DML操作

#写入数据,可以直接使用合法的xml文本
OceanBase(SYS@SYS)>insert into xml_t values(1, '<?xml version="1.0" encoding="UTF-8" ?>'> <employee id="1">'> <name>Alice</name>'> <age>25</age>'> <empdate>2019-03-14</empdate>'> </employee>');
Query OK, 1 row affected (0.017 sec)# 或是借助xmlparse表达式显式的将文本解析成xmltype数据后插入xmltype列
OceanBase(SYS@SYS)>insert into xml_t values(2, xmlparse(document '<?xml version="1.0" encoding="UTF-8" ?>'> <employee id="2">'> <name>Bob</name>'> <age>30</age>'> <empdate>2010-01-01</empdate>'> </employee>'));
Query OK, 1 row affected (0.006 sec)#更新xmltype数据的方式与其它数据类型类似,同样使用update语句,例如将Bob的入职日期改为2010年2月1日
OceanBase(SYS@SYS)>update xml_t set c1=xmlparse(document '<?xml version="1.0" encoding="UTF-8" ?>'> <employee id="2">'>   <name>Bob</name>'>   <age>30</age>'>   <empdate>2010-02-01</empdate>'> </employee>') where id = 2;
Query OK, 1 row affected (0.010 sec)
Rows matched: 1  Changed: 1  Warnings: 02;

2.3. 查询XmlType数据

# 普通查询
OceanBase(SYS@SYS)>select c1 from xml_t;
+--------------------------------------------------------------------------------------------------------------------------------------------+
| C1                                                                                                                                         |
+--------------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="1"><name>Alice</name><age>25</age><empdate>2019-03-14</empdate>
</employee>|
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="2"><name>Bob</name><age>30</age><empdate>2010-02-01</empdate>
</employee>|
+--------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.005 sec)# 也可通过pl方法,getclobval() 和getstringval() 进行查询,查询到的内容不会被改变,
# 但返回类型变为CLOB或者VARCHAR2,注意使用此种方法时,必须使用表别名select t.c1.getclobval() from xml_t t;
+--------------------------------------------------------------------------------------------------------------------------------------------+
| T.C1.GETCLOBVAL()                                                                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="1"><name>Alice</name><age>25</age><empdate>2019-03-14</empdate>
</employee>|
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="2"><name>Bob</name><age>30</age><empdate>2010-02-01</empdate>
</employee>|
+--------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.260 sec)

2.4. 表达式

2.4.1. 本次特性支持的XML表达式总览

表达式名称功能简述
XMLPARSE解析字符串输入,如果是合法,则将其转换为xmltype数据
XMLELEMENT依据输入参数构造一个xmlelement,返回xmltype数据
XMLATTRIBUTES依据输入参数构造xmlattributes,只能作为xmlement表达式的输入,不能单独使用
XMLAGG聚合函数,将多个XML片段聚合成一个xmltype数据
EXTRACT依据Xpath抽取一个XML片段,其结果类型是XMLTYPE
EXTRACTVALUE依据Xpath抽取一个XML片段,默认返回类型为VARCHAR2(4000)
XMLSERIALIZE将XMLType数据序列化为varchar2或者clob,可通过参数进行格式化
XMLCAST抽取XML文档的内容(不包括element name),并将其转换为用户指定的内容
UPDATEXML替换XMLType文档中,Xpath指定的部分内容

EXTRACT,EXTRACTVALUE,UPDATEXML 需要指定Xpath,Xpath用来访问XML数据中心,特定的元素或属性。OB当前支持了XPath 1.0的大部分的location path能力,和一部分filter,function能力。

本次发布尚未支持的常用表达式有:

表达式名称功能简述
XMLTABLE将XML文档展开成一张关系表
XMLEXIST用来判断某个Xpath指定的路径在XML数据中是否存在
XMLISVALID校验XML文档是否符合XMLSchema的定义
XMLQUERY用来执行xquery表达式

2.4.2. 构造XML数据的表达式

2.4.2.1. XMLPARSE

XMLPARSE 表达式用于将一个字符串进行解析,如果是合法的XML文本,则将其转换为XMLType数据并返回。

# 解析document
OceanBase(SYS@SYS)>SELECT XMLPARSE(DOCUMENT '<?xml version="1.0" encoding="UTF-8" ?>'> <employee id="1">'>     <name>Alice</name>'>     <age>25</age>'>     <empdate>2019-03-14</empdate>'> </employee>') AS PO FROM DUAL;
+--------------------------------------------------------------------------------------------------------------------------------------------+
| PO                                                                                                                                         |
+--------------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="1"><name>Alice</name><age>25</age><empdate>2019-03-14</empdate>
</employee>|
+--------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.004 sec)
2.4.2.2. XMLELEMENT

XMLELEMENT 表达式用于构造一个XMLELEMENT,可以指定ELEMENT名称,属性以及内容,此方法用于将关系表数据转换成XML类型。

2.4.2.3. XMLATTRIBUTES

XMLATTRIBUTES 表达式用于构造XML 属性,只能作为XMLELEMENT表达式的输入。

OceanBase(SYS@SYS)>create table employees(name varchar2(20), empdate varchar2(20));
Query OK, 0 rows affected (0.161 sec)OceanBase(SYS@SYS)>insert into employees values('Tom', '2020-01-01');
Query OK, 1 row affected (0.027 sec)OceanBase(SYS@SYS)>insert into employees values('Jerry', '2020-02-01');
Query OK, 1 row affected (0.002 sec)OceanBase(SYS@SYS)>select xmlelement(emp, xmlattributes(name), empdate) as "result" from employees;
+------------------------------------+
| result                             |
+------------------------------------+
| <EMP NAME="Tom">2020-01-01</EMP>   |
| <EMP NAME="Jerry">2020-02-01</EMP> |
+------------------------------------+
2 rows in set (0.008 sec)
2.4.2.4. XMLAGG

XMLAGG 用于将多个XML数据汇聚成单个XML数据,例如,在XMLELEMENT和XMLATTRIBUTES的例子中,我们将基础类型的employees表中的两行数据构造成了两条XML,这里可以使用XMLAGG将其汇聚。

OceanBase(SYS@SYS)>select xmlagg(xmlelement(emp, xmlattributes(name), empdate)) as "result" from employees;
+--------------------------------------------------------------------+
| result                                                             |
+--------------------------------------------------------------------+
| <EMP NAME="Tom">2020-01-01</EMP><EMP NAME="Jerry">2020-02-01</EMP> |
+--------------------------------------------------------------------+
1 row in set (0.007 sec)

2.4.3. 查询XML数据的表达式

2.4.3.1. EXTRACT

EXTRACT表达式,用于选取的XPath指定的内容,其返回值也是XMLType的数据;

OceanBase(SYS@SYS)>select id, extract(c1, '/employee/name') from xml_t;
+------+------------------------------+
| ID   | EXTRACT(C1,'/EMPLOYEE/NAME') |
+------+------------------------------+
|    1 | <name>Alice</name>|
|    2 | <name>Bob</name>|
+------+------------------------------+
2 rows in set (0.006 sec)/name') from xml_t;
2.4.3.2. EXTRACTVALUE

EXTRACTVALUE表达式与EXTRACT表达式类似,也选取XPath指定的内容,但其返回值是varchar2类型的数据,只会返回XPath指定路径的内容,不包括Element tag:

OceanBase(SYS@SYS)>select id, extractvalue(c1, '/employee/name') from xml_t;
+------+-----------------------------------+
| ID   | EXTRACTVALUE(C1,'/EMPLOYEE/NAME') |
+------+-----------------------------------+
|    1 | Alice                             |
|    2 | Bob                               |
+------+-----------------------------------+
2 rows in set (0.006 sec)
2.4.3.3. XMLSERIALIZE

XMLSERIALIZE用于将XMLType的数据转换为CLOB,BLOB或者VARCHAR2类型的数据,此表达式可以控制XML中各个元素的换行或者缩进行为。

OceanBase(SYS@SYS)>select xmlserialize(document c1 as varchar2(200) no indent) as res from xml_t where id=1;
+--------------------------------------------------------------------------------------------------------------------------------------+
| RES                                                                                                                                  |
+--------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="1">
<name>Alice</name>
<age>25</age>
<empdate>2019-03-14</empdate>
</employee>|
+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.007 sec)
2.4.3.4. XMLCAST

用于将XML中的内容转换为其它类型,例如NUMBER、VARCHAR2、CHAR、CLOB、BLOB及任何日期时间数据类型。

# number
OceanBase(SYS@SYS)>select xmlcast(xmlparse(CONTENT '<a>123.01</a>') as number) from dual;
+---------------------------------------------------+
| XMLCAST(XMLPARSE(CONTENT'<A>123.01</A>')ASNUMBER) |
+---------------------------------------------------+
|                                            123.01 |
+---------------------------------------------------+
1 row in set (0.004 sec)# decimal
OceanBase(SYS@SYS)>select xmlcast(xmlparse(CONTENT '<a>123.01</a>') as decimal) from dual;
+----------------------------------------------------+
| XMLCAST(XMLPARSE(CONTENT'<A>123.01</A>')ASDECIMAL) |
+----------------------------------------------------+
|                                                123 |
+----------------------------------------------------+
1 row in set (0.005 sec)# timestamp
OceanBase(SYS@SYS)>select xmlcast(xmlparse(CONTENT '<a>2023-04-03 15:13:00</a>') as timestamp) as res from dual;
+----------------------------+
| RES                        |
+----------------------------+
| 2023-04-03 15:13:00.000000 |
+----------------------------+
1 row in set (0.004 sec)# date
OceanBase(SYS@SYS)>select xmlcast(xmlparse(CONTENT '<a>2023-04-03 15:13:00</a>') as date) as res from dual;
+---------------------+
| RES                 |
+---------------------+
| 2023-04-03 15:13:00 |
+---------------------+
1 row in set (0.004 sec)

2.4.4. 修改XML数据的表达式

2.4.4.1. UpdateXML

使用Update表达式,可以部分更新XML数据内的内容:

OceanBase(SYS@SYS)>SELECT c1 FROM xml_t WHERE id = 2;
+------------------------------------------------------------------------------------------------------------------------------------------+
| C1                                                                                                                                       |
+------------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="2"><name>Bob</name><age>30</age><empdate>2010-02-01</empdate>
</employee>|
+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.006 sec)OceanBase(SYS@SYS)>SELECT UPDATEXML(c1, '/employee/empdate/text()','2010-03-01') FROM xml_t-> WHERE id = 2;
+------------------------------------------------------------------------------------------------------------------------------------------+
| UPDATEXML(C1,'/EMPLOYEE/EMPDATE/TEXT()','2010-03-01')                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------+
| <?xml version="1.0" encoding="UTF-8"?>
<employee id="2"><name>Bob</name><age>30</age><empdate>2010-03-01</empdate>
</employee>|
+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.007 sec)

3. 未来规划:支持XQuery、XPath、XSchema

本次XML特性在Oceanbase 4.2 商业版上发布,限Oracle租户使用。

当前XML 特性还不支持XQuery,对XPath的支持也还不全面,在后续版本中会持续补全这部分能力。未来也会考虑提供对XSchema的支持,以及基于XSchema的XML关系对象存储方式,关系对象存储可以提供更好的存储性能以及XML中片段的查询效率。

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

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

相关文章

Web前端一套全部清晰 ① 学习路线

一切都会好的&#xff0c;我一直相信 —— 24.4.25 基础入门:HTML5CSS3移动web技术进阶: JavaScript全套(js基础Web APIsjs进阶) ——> 《框架前置课》AJAX-Node.js-Webpack-GitVUE开发: 框架前置课Node.js&es6 ——> Vue2Vue3全套 ——> iHRM人力资源后台管理项 …

SOLIDWORKS代理商能够提供哪些服务?

​​ SOLIDWORKS是一款由法国达索系统公司开发的一款三维计算机辅助设计(3D CAD)软件。在华南区鑫辰科技是SOLIDWORKS代理商&#xff0c;他为广大用户提供了专业的售前咨询、培训和售后服务。 一、SOLIDWORKS代理商的角色与职责 1.售前咨询&#xff1a;SOLIDWORKS代理商在售前…

【北京迅为】《iTOP龙芯2K1000开发指南》-第三部分 迅为龙芯开发板快速体验

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

冰蝎、蚁剑和哥斯拉

冰蝎、蚁剑和哥斯拉都是常见的远程管理工具&#xff0c;它们的原理是通过在受害者主机上部署后门程序&#xff0c;通过远程控制的方式进行攻击。然而&#xff0c;它们在功能上存在一些差异。 冰蝎主要通过Java Web服务器实现远程控制。攻击者首先在受害者机器上植入后门&#x…

学习笔记 - AI大模型部署-环境

AI大模型部署-环境 环境 环境 cuda与pytorch pytorch需要和cuda版本匹配&#xff0c;否则在 import torch torch.cuda.is_avvailable()测试中会返回false&#xff0c;意味着torch和cuda不匹配无法正常调用gpu去进行训练和推理 怎么根据自己的cuda和想要的torch版本进行安装 …

使用navicate演示在 PostgreSQL 中使用 for 循环语句

1、简单循环示例 do $$ beginfor cnt in 1..10 loopraise notice cnt: %, cnt;end loop; end; $$ navicate中执行 2、循环查询 do $$ declare_record record; beginfor _record in (SELECT version,description FROM flyway_schema_history ORDER BY installed_rank desc li…

JavaScript:js实现在线五子棋人机(人人)对弈

在线五子棋人机对弈 全部使用前端技术,使用HTML,CSS以及JS进行实现. 棋盘在后端就是一个15*15的二维数组 页面设计 页面设计的比较粗糙 主要使用js自带的canvas画布进行绘画 HTML代码如下: <div class"outer"><canvas id"canvas" height&qu…

软件设计师-基础知识科目-计算题汇总1

1. 位运算&#xff1a; 略 2. 进制转换&#xff1a; 3. 计算内存存储容量&#xff1a; 前置概念&#xff1a;** 内存地址是16进制。 16进制后面的加上的字母H&#xff0c;表示数字为16进制。内存地址编址的单位是Byte&#xff0c;1K 1024B&#xff0c;1024用16进制表示为400H …

SQL Server 中的 dbo:正确调用表的方法与实践

前言 在 SQL Server 数据库管理系统中&#xff0c;dbo&#xff08;Database Owner&#xff09;扮演着至关重要的角色&#xff0c;它代表着数据库的所有者&#xff0c;拥有对该数据库的最高权限。本文将聚焦于 dbo 在表调用场景中的应用&#xff0c;详细介绍其含义、权限特点以及…

C语言 流程图与伪代码 缩减

本文 我们来说说流程图 伪代码和代码缩进 这些可以让我们在后面书写复杂逻辑时 不会感到 繁琐或逻辑混乱 流程图(Flowchart) 是用以算法、工作流或流程的一种框图表示&#xff0c;它以不同类型的框代表不同种类的步骤&#xff0c;每两个步骤之间则以箭头连接。 流程图是程序…

C++ WebServer的细节理解

1. 文件描述符-非阻塞模式 fcntl(fd, F_SETFL, fcntl(fd, F_GETFD, 0) | O_NONBLOCK);代码解释&#xff1a; 上面这句代码&#xff0c;先查询文件描述符 fd 当前的标志&#xff0c;然后将 O_NONBLOCK 标志加入&#xff0c;并通过 F_SETFL 更新文件描述符&#xff0c;最终实现将…

【UE C++】打印输出的两种方式

目录 一、UE_LOG 二、调试屏幕信息 一、UE_LOG 定义&#xff1a; UE_LOG 是一个将格式化消息记录到日志文件中的宏。 用法&#xff1a; UE_LOG(LogTemp, Warning, TEXT("Hello World")); 第一个输入参数 LogTemp 是提供给 DEFINE_LOG_CATEGORY 宏的类别名称。你…

OpenAIGPT-4.5提前曝光?

OpenAI GPT-4.5的神秘面纱&#xff1a;科技界的震撼新篇章 在人工智能的世界里&#xff0c;每一次技术的飞跃都不仅仅是一次更新&#xff0c;而是对未来无限可能的探索。近日&#xff0c;科技巨头OpenAI似乎再次站在了这场革命的前沿&#xff0c;其潜在的新产品——GPT-4.5 Tur…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题&#xff0c;通常是没有处于调式模式环境下&#xff0c;所以我们需要在gcc指令后加 【-g】。 因为&#xff0c;我么的gcc编辑器默认是动态链接&#xff0c;而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…

MySQL面试题入门:四大范式、SQL生命周期、SQL六大语言、索引、最左匹配原则....

1、数据库四大范式&#xff1f; 第一范式&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式&#xff1a;满足第一范式&#xff1b;且不存在部分依赖&#xff0c;即非主属性必须完全依赖于主属性。(主属性即主键&#xf…

tar 和 zip 打包压缩命令

1. tar 文件的归档 tar [选项] 归档压缩后生成的文件 打包文件常用参数&#xff1a;-c # 创建文件-x # 提取解压还原文件-v # 显示详细执行过程-f # 指定备份文件-t # 列出压缩包中包括哪些文件&#xff0c;不解包&#xff0c;查看包中的内容-C # 指定解压位置 #对/o…

Kubernetes(K8S)特性有哪些?

Kubernetes简介 Kubernetes是一个开源的容器编排引擎&#xff0c;用于自动部署、扩展和管理容器化应用程序。它提供了一个平台来管理容器化应用程序的部署、扩展、自动化操作、服务发现和负载均衡等功能&#xff0c;让开发者能够更轻松地管理和运行容器化应用程序。 Kubernet…

Unity | 集成 Protobuf(proto 转 cs 插件及序列化与反序列化)

1. 添加 dll 1. 下载 protobuf 源码 根据需要下载 protobuf 指定版本的源码&#xff0c;这里以 v3.21.12&#xff08;protobuf-csharp-3.21.12.zip&#xff09;为例&#xff1a; 下载地址&#xff1a;「https://github.com/protocolbuffers/protobuf/releases」 2. 下载 Vis…

Java面试之JVM篇(共七篇---完结)

Java面试之虚拟机篇&#xff08;一&#xff09;&#xff1a;JVM概述与内存结构 在Java的面试中&#xff0c;虚拟机&#xff08;JVM&#xff09;是必考的知识点之一。作为Java程序运行的基础环境&#xff0c;JVM对Java的性能和稳定性有着至关重要的影响。本文将首先介绍JVM的基…

常见内网代理工具及其应用

常见内网代理工具 1. 正向代理&#xff1a;Squid原理示例 2. 反向代理&#xff1a;Nginx原理示例 3. SOCKS代理&#xff1a;Shadowsocks原理示例 零基础入门学习路线视频配套资料&国内外网安书籍、文档网络安全面试题 常见的内网代理工具包括多种类型&#xff0c;如正向代理…