搜索​​​​

清除过滤器
文章
Lele Yang · 七月 13, 2021

FAQ 常见问题系列--系统管理篇 如何在Linux上配置InterSystems IRIS服务随机自启动?

与Windows上默认安装为服务随机自启动不同,我们在Linux上安装完InterSystems IRIS后,默认是没有配置系统服务的,需要做手动配置。本文提供使用systemd方式来配置InterSystems IRIS服务随机自启动的简单示例,供大家参考。 假设我们已经安装了InterSystems IRIS产品,安装完成后您可以通过iris list来来查看实例信息,包括安装路径,如:"/intersystems/iris" [root@RHEL8-64-001 ~]# iris list Configuration 'IRIS' (default) directory: /intersystems/iris versionid: 2021.2.0L.546.0 datadir: /intersystems/iris conf file: iris.cpf (SuperServer port = 51773, WebServer = 52773) status: running, since Mon May 31 05:03:09 2021 state: ok product: InterSystems IRIS 在安装完成后,用以下方式搜索不到iris.service, [root@RHEL8-64-001 ~]# systemctl list-unit-files --type=service|grep iris.service 如何将其配置为系统服务呢,下面是一个简单示例及操作步骤,供大家参考。注意:请使用root用户或者拥有root权限的用户来进行。 1. 创建systemd service,1) 在/usr/lib/systemd/system下创建文件,iris.service,内容如下, [root@RHEL8-64-001 system]# cat iris.service [Unit] Description=InterSystems IRIS [Service] Type=forking ExecStart=/bin/bash -c '/intersystems/iris/irisstart 2>&1 | logger -t iris_start' ExecStop=/bin/bash -c '/intersystems/iris/irisstop quietly 2>&1 | logger -t iris_stop' RemainAfterExit=yes [Install] WantedBy=multi-user.target 其中,/intersystems/iris为实例安装目录。2) 创建后,更改文件的属性, [root@RHEL8-64-001 system]# chmod 755 iris.service 更改后,文件属性如下,-rwxr-xr-x. 1 root root 225 May 31 07:32 iris.service 2. 启用该Service。1)启用,创建系统service的link, [root@RHEL8-64-001 system]# systemctl enable iris.service Created symlink /etc/systemd/system/multi-user.target.wants/iris.service → /usr/lib/systemd/system/iris.service. 2)确认状态,确保已经enabled [root@RHEL8-64-001 system]# systemctl list-unit-files --type=service|grep iris.service iris.service enabled 3. 测试该Service,1)进行到这个步骤,查看状态应为inactive(dead)。 [root@RHEL8-64-001 system]# systemctl status iris ● iris.service - InterSystems IRIS Loaded: loaded (/usr/lib/systemd/system/iris.service; enabled; vendor preset> Active: inactive (dead) lines 1-3/3 (END) 2) 下面来启动iris服务, [root@RHEL8-64-001 system]# systemctl start iris.service 3) 再次查看服务状态已经为active(running),启动成功。 [root@RHEL8-64-001 system]# systemctl status iris ● iris.service - InterSystems IRIS Loaded: loaded (/usr/lib/systemd/system/iris.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2021-05-31 07:57:43 EDT; 1min 37s ago Process: 1704 ExecStart=/bin/bash -c /intersystems/iris/irisstart 2>&1 | logger -t iris_start (code=exited, status=0/SUCCE> Tasks: 52 (limit: 11442) Memory: 246.0M CGroup: /system.slice/iris.service ├─2076 /intersystems/iris/bin/irisdb -s/intersystems/iris/mgr/ -w/intersystems/iris/mgr/ -cc -B -C/intersystems/i> ├─2085 /intersystems/iris/bin/irisdb WD > ├─2086 /intersystems/iris/bin/irisdb GC > ├─2087 /intersystems/iris/bin/irisdb JD > ├─2088 /intersystems/iris/bin/irisdb AUX7 > ├─2089 /intersystems/iris/bin/irisdb AUX6 > ├─2090 /intersystems/iris/bin/irisdb AUX5 > ├─2091 /intersystems/iris/bin/irisdb AUX4 > ├─2092 /intersystems/iris/bin/irisdb AUX3 > ├─2093 /intersystems/iris/bin/irisdb AUX2 > ├─2094 /intersystems/iris/bin/irisdb AUX1 > ├─2095 /intersystems/iris/bin/irisdb DBXD > ├─2098 /intersystems/iris/bin/irisdb -s/intersystems/iris/mgr -cj -p13 START^MONITOR ├─2102 /intersystems/iris/bin/irisdb -s/intersystems/iris/mgr -cj -p13 START^CLNDMN ├─2105 /intersystems/iris/bin/irisdb -s/intersystems/iris/mgr -cj -p13 stumonitor^JRNRESTO ├─2109 /intersystems/iris/bin/irisdb -s/intersystems/iris/mgr -cj -p13 ^RECEIVE 4)最后重启操作系统,测试iris可以随机自启动。 注:以上测试在Red Hat Linux Enterprise 8版本上进行。
问题
Johnny Wang · 七月 13, 2021

关于Ensemble中消息形成过程的问题

各位老师好! 如下两图,是HL7信息体,在形成消息之前,我们一般会先制定文档,包括消息题、消息段、阈值;但是最终在Ensemble中形成的消息是怎么一个过程? 制定好的消息文档可以转换成IRIS可以读取的格式,导入到IRIS中成为消息Schema结构。在处理消息时,可以配置接口应用我们指定的消息Schema结构去处理消息。更多细节可参见文档:HL7 Schemas and Available Tools | Routing HL7 Version 2 Messages in Productions | InterSystems IRIS for Health 2023.1
文章
姚 鑫 · 七月 12, 2021

第一章 查询目录和驱动器

# 第一章 查询目录和驱动器 `%Library.File`(简称`%File`)为处理文件和目录提供了广泛的API。本文将介绍该API的主要功能。有关属性、方法和查询的规范列表,请参见类参考。 注意:如果指定了部分文件名或目录名,这些方法中的大多数都引用的项相对于包含正在使用的命名空间的默认全局数据库的目录。该目录在本文中称为“默认目录”。这条规则的任何例外都在文章中注明。 此外,仅当基础操作系统将文件名和目录名视为区分大小写时,这些方法才会将文件名或目录名视为区分大小写。也就是说,文件或目录名在Unix上区分大小写,但在Windows上不区分大小写。 # 查询目录和驱动器 ## 列出目录的内容 `FileSet`类查询列出目录的内容。此查询按顺序接受以下参数: 1. `directory` — 指定要检查的目录的名称。 2. `wildcards` 通配符 — 指定要匹配的文件名模式(如果有)。 3. `sortby` 排序依据 — 指定如何对结果进行排序。使用以下值之一: - `Name` 名称—文件的名称(默认) - `Type` 类型—项目类型 - `DateCreated` 创建日期—创建文件的日期和时间 - `DateModified` 日期修改—文件上次修改的日期和时间 - `Size` 大小—文件大小 4. `includedirs` —指定如何处理给定目录中的目录。如果此参数为真(1),查询将返回任何文件之前的所有目录,并且目录名忽略通配符参数。如果此参数为false (0),通配符参数适用于文件和目录。默认值为0。 5. `delimiter` 分隔符—指定通配符参数中通配符之间的分隔符。默认值为; 此查询返回的结果集提供了以下字段: - `Name` 名称—项目的完整路径名。 - `Type` 类型—项目的类型:`F`表示文件,`D`表示目录,`S`表示符号链接。 - `Size` 大小—文件大小,以字节为单位。对于目录和符号链接,此字段为空。 - `DateCreated` 创建日期—创建项目时的日期和时间,格式为`yyyy-mm-dd hh:mm:ss`。 - `DateModified` 日期修改—上次修改项目的日期和时间,格式为`yyyy-mm-dd hh:mm:ss`。 - `ItemName` 项目名称—项目的简称。对于文件,这是单独的文件名,没有目录。对于目录,这只是目录路径的最后一部分。 注意:Windows是目前唯一跟踪实际创建日期的平台。其他平台存储最后一次文件状态更改的日期。 下面是一个使用这个类查询的简单示例: ```java /// desc:查看目标路径所有文件。 /// w ##class(Demo.FileDemo).ShowDir("C:\InterSystems\Cache\mgr", "*.log", "Size") /// w ##class(Demo.FileDemo).ShowDir("E:\temp", "*.xml", "Size") ClassMethod ShowDir(dir As %String = "", wildcard As %String = "", sort As %String = "Name") { s stmt = ##class(%SQL.Statement).%New() s status = stmt.%PrepareClassQuery("%File", "FileSet") if $$$ISERR(status) { do $system.OBJ.DisplayError(status) quit } s resultSet = stmt.%Execute(dir, wildcard, sort) while resultSet.%Next() { w !, resultSet.%Get("Name") w " ", resultSet.%Get("Type") w " ", resultSet.%Get("Size") } q "" } ``` 从终端对指定目录运行此方法,筛选日志文件,并按文件大小排序,结果如下所示: ```java DHC-APP> w ##class(Demo.FileDemo).ShowDir("E:\temp", "*.xml", "Size") E:\temp\testPerson.xml F 117 E:\temp\samplePerson.xml F 327 E:\temp\xmlnewtest.xml F 351 E:\temp\Person.xml F 259854 E:\temp\tempPerson.xml F 259854 ``` 又例如,下面的方法递归检查目录及其所有子目录,并写出它找到的每个文件的名称: ```java /// w ##class(Demo.FileDemo).ShowFilesInDir("E:\temp") ClassMethod ShowFilesInDir(directory As %String = "") { s stmt = ##class(%SQL.Statement).%New() s status = stmt.%PrepareClassQuery("%File", "FileSet") if $$$ISERR(status) { d $system.OBJ.DisplayError(status) q } s resultSet = stmt.%Execute(directory) while resultSet.%Next() { s name = resultSet.%Get("Name") s type = resultSet.%Get("Type") if (type = "F") { w !, name } elseif (type = "D"){ d ..ShowFilesInDir(name) } } q "" } ``` 在默认目录下的终端中运行此方法会产生如下结果: ```java DHC-APP>w ##class(Demo.FileDemo).ShowFilesInDir("E:\temp") E:\temp\config.txt E:\temp\game.jpg E:\temp\Person.xml E:\temp\ppg.txt E:\temp\qcache.txt E:\temp\rfc7158.html E:\temp\rfc7158.txt E:\temp\samplePerson.xml E:\temp\SecurityXml.txt E:\temp\temp1.txt E:\temp\tempPerson.xml E:\temp\test\Tests.xml E:\temp\testPerson.xml E:\temp\Testzf.dll E:\temp\textReader.txt E:\temp\xmlnewtest.xml E:\temp\xmlXpath.txt E:\temp\yaoxin.txt E:\temp\yxtest.txt E:\temp\yxtest_Errors.log E:\temp\yxtest_Unsupported.log E:\temp\汉子转拼音global.gof ``` ## 列出驱动器或装载的文件系统 `Drivelist`类查询列出可用的驱动器(在Windows上)或已装载的文件系统(在Unix上)。此查询接受一个参数: 1. `fullyqualified`-如果此参数为1,则查询在每个Windows驱动器名称上都包含一个尾随反斜杠。对其他平台没有影响。默认值为0。 此查询返回的结果集提供了一个字段: - `Drive` 驱动器—驱动器的名称(在Windows上)或装载的文件系统的名称(在Unix上)。 以下示例显示了如何使用该查询: ```java /// w ##class(Demo.FileDemo).ShowDrives() ClassMethod ShowDrives() { s stmt = ##class(%SQL.Statement).%New() s status = stmt.%PrepareClassQuery("%File","DriveList") if $$$ISERR(status) { d $system.OBJ.DisplayError(status) q } s resultSet = stmt.%Execute(1) while resultSet.%Next() { w !, resultSet.%Get("Drive") } q "" } ``` 在终端中运行该方法会得到如下结果: ```java DHC-APP>w ##class(Demo.FileDemo).ShowDrives() c:\ d:\ e:\ g:\ ```
公告
jieliang liu · 七月 12, 2021

InterSystems技术文章写作大赛启动!

嗨,开发者们, 你准备好迎接新的挑战了吗? 我们很高兴地宣布第一届InterSystems技术文章写作比赛: 🏆 InterSystems技术文章写作大赛 🏆 从2021年7月15日至8月15日,写一篇与InterSystems技术有关的任何主题的文章! 每个人都有奖品: 在此期间,每个在DC上发表文章的人都将获得一个特别的奖品包! 大奖: Apple iPad 参加我们的新比赛,你的内容将被超过55K的月度读者看到! 详情如下。 奖品: 1. 每个人都是InterSystems技术文章竞赛的赢家! 任何在比赛期间写文章的用户都会得到特别的奖励: 🎁 独特的开发者社区连帽衫 🎁 InterSystems 贴纸 2. 专家选择奖 – 文章将由InterSystems的专家进行评判: 🥇 一等奖: Apple iPad 128GB 🥈 二等奖: Amazon Kindle 8G Paperwhite 🥉 三等奖: Nike Utility Speed Backpack 或者另选: Raspberry Pi 4 8GB + InterSystems IRIS社区版安装包镜像 3. 开发社区奖 – 点赞最多的文章。 获胜者将有机会从以下奖品中选择一个。 🎁 Nike Utility Speed Backpack 🎁 Amazon Kindle 8G Paperwhite 谁可以参加? 任何开发者社区成员,除了InterSystems的员工。 创建一个账户! 比赛时间 📝 七月 15日 - 八月 15日: 发表关于社区和投票时间的文章。. 在这段时间内发表一篇文章。 DC成员可以用 "赞 "为发表的文章投票--在社区奖中投票。 注意:你越早发表文章,你就越有时间收集赞。 🎉 八月 16日: 获奖者名单公布。 有什么要求? ❗️ 任何在比赛期间写的文章,只要满足以下要求,就能自动参加比赛: 文章必须与InterSystems技术有关 文章必须是英文的 文章必须是100%的新文章(可以是现有文章的延续)。 文章不应抄袭或翻译。 文章大小。>超过1,000个字符 团队规模:个人(允许同一作者的多个作品)。 要写什么? ❗️ 你可以选择任何与InterSystems技术相关的技术主题。 这里有一些选择文章主题的可能领域。这些只是例子,你可以自由选择任何你想要的东西。 # 主题 细节 1 嵌入式Python简介 嵌入式Python是InterSystems IRIS的一个令人兴奋的新功能,允许开发人员用Python编写方法、SQL存储过程等。 2 来自互操作性的嵌入式Python 探索如何从互操作性中利用嵌入式Python。 3 嵌入式Python。通过语言结构进行翻译 虽然我们的目标是实现嵌入式Python的无缝集成,但还是有一些技巧和窍门可以让事情变得顺利。下划线方法、字典、列表和其他。从ObjectScript中调用Python功能的最佳方式是什么? 4 InterSystems报告设计器介绍 续写 这篇文章. 续篇应该包括: 创建目录 创建基本的报告类型,即 图表(柱状图、饼状图、线状图、仪表图、热图...)。 表(摘要和详细)。 串联表 发布报表到报表服务器 创建一个时间表 教程参考: Getting Started with InterSystems Reports 5 从互操作性/IRIS调用报告 一篇描述如何从IRIS上执行(和获得)InterSystems Reports Report的文章,该报告来自Interoperability Production。 6 使用InterSystems的地图报告 一篇描述如何用地理空间数据建立InterSystems报告的文章。HoleFoods数据集包含了交易的地点,你可以使用。 7 如何用InterSystems IRIS做CI/CD – 8 使用Kafka连接的变更数据采集 一个例子显示了如何设置Kafka Connect并通过Kafal Connect JDBC连接器导出&导入SQL数据。 9 将分析/ML应用于SQL语句索引 – 10 我最喜欢的维护任务,自动化 – 11 利用审计数据库 – 12 设置GitHub动作的三个步骤,让你的应用程序立于不败之地 – 13 IRIS实例中的OAuth2授权 – 14 在K8s上设置镜像 – 15 在IRIS分析中使用%MDX和%KPI而不是主题区域 – 16 尝试外部语言网关/与以前的编程语言网关相比 Example 17 从IAM向Kafka流式传输事件 – 18 IntegratedML演练 – 19 使用Python将请求导出到Excel – 20 将云服务与production结合起来 例如,MS Azure Cognitive Services或Amazon Rekognition。 21 Working with IKO – 22 IKO IRIS on AWS Kubernetes with Hugepages – 23 纳入IKO的备份 – 24 IKO - 创建一个有计算节点、SAM、无分片的集群 包括CPF文件来设置我们的最佳实践。 25 与ECP建立的数据科学共享工作组 有一个数据服务器,每个数据科学家的桌面上都有一个计算节点。显示数据在断开连接时可以使用,重新连接时可以同步。 26 讨论云部署的存储选项的文章(本地存储、块存储等的性能差异)和权衡(如果使用块存储,你可能不需要镜像,等等)。 – 注意:允许不同作者的同一主题的文章。 欢迎在本帖的评论中提交你的主题想法。 所以。 我们等待着你的精彩文章! 祝你们好运,让普利策的力量与你们同在! ✨
文章
姚 鑫 · 七月 10, 2021

Caché XML

# Caché XML # [第一章 InterSystems XML工具简介☆☆☆☆](https://cn.community.intersystems.com/post/第一章-intersystems-xml工具简介) # [第二章 从对象写入XML输出☆☆☆☆☆](https://cn.community.intersystems.com/post/第二章-从对象写入xml输出) # [第三章 指定输出的字符集☆☆☆☆☆](https://cn.community.intersystems.com/post/第三章-指定输出的字符集) # [第四章 添加命名空间声明☆☆☆☆☆](https://cn.community.intersystems.com/post/第四章-添加命名空间声明) # [第五章 生成XML元素☆☆☆☆☆](https://cn.community.intersystems.com/post/第五章-生成xml元素) # [第六章 控制名称空间的使用☆☆☆☆☆](https://cn.community.intersystems.com/post/第六章-控制名称空间的使用) # [第七章 控制命名空间分配的外观☆☆☆☆☆](https://cn.community.intersystems.com/post/第七章-控制命名空间分配的外观) # [第八章 Other Options of the Writer☆☆☆☆☆](https://cn.community.intersystems.com/post/第八章-other-options-writer) # [第九章 将XML导入到对象中☆☆☆☆☆](https://cn.community.intersystems.com/post/第九章-将xml导入到对象中) # [第十章 XML元素和属性☆☆☆☆☆](https://cn.community.intersystems.com/post/第十章-xml元素和属性) # [第十一章 重新定义读取器处理相关对象的方式☆☆☆☆☆](https://cn.community.intersystems.com/post/第十一章-重新定义读取器处理相关对象的方式) # [第十二章 XML其他示例☆☆☆☆☆](https://cn.community.intersystems.com/post/第十二章-xml其他示例) # [第十三章 将XML文档表示为DOM☆☆☆☆☆](https://cn.community.intersystems.com/post/第十三章-将xml文档表示为dom) # [第十四章 XML获取当前节点信息☆☆☆☆☆](https://cn.community.intersystems.com/post/第十四章-xml获取当前节点信息) # [第十五章 XML检查属性☆☆☆☆☆](https://cn.community.intersystems.com/post/第十五章-xml检查属性) # [第十六章 创建或编辑DOM☆☆☆☆☆](https://cn.community.intersystems.com/post/第十六章-创建或编辑dom) # [第十七章 加密XML文档☆☆☆](https://cn.community.intersystems.com/post/第十七章-加密xml文档) # [第十八章 签署XML文档☆☆☆](https://cn.community.intersystems.com/post/第十八章-签署xml文档) # [第十九章 使用%XML.TextReader☆☆☆☆☆](https://cn.community.intersystems.com/post/第十九章-使用xmltextreader) # [第二十一章 使用%XML.TextReader 导航文档☆☆☆☆☆](https://cn.community.intersystems.com/post/第二十一章-使用xmltextreader-导航文档) # [第二十二章 计算XPath表达式☆☆☆☆☆](https://cn.community.intersystems.com/post/第二十二章-计算xpath表达式) # [第二十三章 执行XSLT转换☆☆☆](https://cn.community.intersystems.com/post/第二十三章-执行xslt转换) # [第二十四章 执行XSLT转换☆☆☆](https://cn.community.intersystems.com/post/第二十四章-执行xslt转换) # [第二十五章 添加和使用XSLT扩展函数☆☆☆](https://cn.community.intersystems.com/post/第二十五章-添加和使用xslt扩展函数) # [第二十六章 定制SAX解析器的使用方式☆☆☆☆](https://cn.community.intersystems.com/post/第二十六章-定制sax解析器的使用方式) # [第二十七章 定制SAX解析器的执行自定义实体解析☆☆☆☆](https://cn.community.intersystems.com/post/第二十七章-定制sax解析器的执行自定义实体解析) # [第二十八章 定制SAX解析器创建自定义内容处理程序☆☆☆☆](https://cn.community.intersystems.com/post/第二十八章-定制sax解析器创建自定义内容处理程序) # [第二十九章 从XML架构生成类☆☆☆☆](https://cn.community.intersystems.com/post/第二十九章-从xml架构生成类) # [第三十章 从类生成XML架构☆☆☆☆](https://cn.community.intersystems.com/post/第三十章-从类生成xml架构) # [第三十一章 检查命名空间和类☆☆☆☆](https://cn.community.intersystems.com/post/第三十一章-检查命名空间和类) # [第三十二章 XML基础知识概念☆☆☆☆☆](https://cn.community.intersystems.com/post/第三十二章-xml基础知识概念) # Caché XML 在CSDN 上 # [第一章 InterSystems XML工具简介☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117734468) # [第二章 从对象写入XML输出☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117765426) # [第三章 指定输出的字符集☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117804741) # [第四章 添加命名空间声明☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117837881) # [第五章 生成XML元素☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117867002) # [第六章 控制名称空间的使用☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117898116) # [第七章 控制命名空间分配的外观☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117928000) # [第八章 Other Options of the Writer☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117946239) # [第九章 将XML导入到对象中☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/117980776) # [第十章 XML元素和属性☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118015143) # [第十一章 重新定义读取器处理相关对象的方式☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118046952) # [第十二章 XML其他示例☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118066297) # [第十三章 将XML文档表示为DOM☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118079066) # [第十四章 XML获取当前节点信息☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118099092) # [第十五章 XML检查属性☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118141298) # [第十六章 创建或编辑DOM☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118173945) # [第十七章 加密XML文档☆☆☆](https://yaoxin.blog.csdn.net/article/details/118205925) # [第十八章 签署XML文档☆☆☆](https://yaoxin.blog.csdn.net/article/details/118240046) # [第十九章 使用%XML.TextReader☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118265395) # [第二十章 使用%XML.TextReader 节点属性☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118291334) # [第二十一章 使用%XML.TextReader 导航文档☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118324134) # [第二十二章 计算XPath表达式☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118353276) # [第二十三章 执行XSLT转换☆☆☆](https://yaoxin.blog.csdn.net/article/details/118378341) # [第二十四章 执行XSLT转换☆☆☆](https://yaoxin.blog.csdn.net/article/details/118404243) # [第二十五章 添加和使用XSLT扩展函数☆☆☆](https://yaoxin.blog.csdn.net/article/details/118433664) # [第二十六章 定制SAX解析器的使用方式☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118456474) # [第二十七章 定制SAX解析器的执行自定义实体解析☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118478683) # [第二十八章 定制SAX解析器创建自定义内容处理程序☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118510180) # [第二十九章 从XML架构生成类☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118538567) # [第三十章 从类生成XML架构☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118565357) # [第三十一章 检查命名空间和类☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118594282) # [第三十二章 XML基础知识概念☆☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/118629407) # 预告 下一期系列将用一个月的时间连载,**《Caché File》**,**《Caché 关键字大全》**,敬请期待。 # 交流群 - QQ群号:410039091 - 笔者QQ:454115408 - 公众号:技术理科直男 - [intersys版主:姚鑫](https://cn.community.intersystems.com/user/236891/posts) ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9VqwzNP-1608850948003)(3E1D939266954ED48BDAEA9B8086B11E)\]](https://img-blog.csdnimg.cn/20201225070433434.png) # 大型免费课程,进群410039091获取课程目录 - 适合所有阶段程序员,总有一款你遗漏的知识点! ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607145017460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhb3hpbjUyMTEyMw==,size_16,color_FFFFFF,t_70#pic_center)
文章
姚 鑫 · 七月 9, 2021

第三十二章 XML基础知识概念

# 第三十二章 XML基础知识概念 ## attribute 以下形式的名值对: ```java ID="QD5690" ``` 属性位于元素中,如下所示,一个元素可以有任意数量的属性。 ```xml Cromley,Marcia N. ``` ## CDATA区域 表示不应该验证的文本,如下所示: ```xml ``` 一个`CDATA`(字符数据)区段不能包含字符串`]]`>,因为这个字符串标志着区段的结束。 这也意味着`CDATA`区段不能嵌套。 注意,`CDATA`部分的内容必须符合为XML文档指定的编码,XML文档的其余部分也是如此。 ## comment 不是XML文档主数据的一部分的插入说明。 注释是这样的: ```xml ``` ## content model 对XML元素的可能内容的抽象描述。 可能的内容模型如下: - 空内容模型(不允许有子元素或文本节点) - 简单内容模型(只允许文本节点) - 复杂内容模型(只有子元素) - 混合内容模型(允许子元素和文本节点) 在所有情况下,元素可能有也可能没有属性; 短语内容模型不涉及元素中属性的存在或不存在。 ## default namespace 给定上下文中任何非限定元素所属的名称空间。 添加的默认名称空间没有前缀。 例如: ```xml Isaacs,Rob G. 1981-01-29 ``` 因为这个名称空间声明没有使用前缀,所以``、``和``元素都属于这个名称空间。 注意,下面的XML没有使用默认名称空间,它实际上等同于前面的示例: ```xml Isaacs,Rob G. 1981-01-29 ``` ## DOM 文档对象模型(DOM)是表示XML和相关格式的对象模型。 ## DTD(文档类型定义) 包含在XML文档或外部文件中的一系列文本指令。 它定义了可以在文档中使用的所有有效元素和属性。 dtd本身不使用XML语法。 ## element 一个元素通常由两个标记(一个开始标记和一个结束标记)组成,可能包含文本和其他元素。 元素的内容是这两个标记之间的所有内容,包括文本和任何子元素。 下面是一个完整的XML元素,包含开始标记、文本内容和结束标记: ```xml Cromley,Marcia N. ``` 一个元素可以有任意数量的属性和任意数量的子元素。 空元素可以包含一个开始标记和一个结束标记,也可以只包含一个标记。 下面的例子是等价的: ```xml ``` 在实践中,元素很可能引用数据记录的不同部分,例如 ```xml Barnes,Gerry 1981-04-23 ``` ## entity (在XML文件中)表示一个或多个字符的文本单元。 一个实体有以下结构: ```xml &characters; ``` ## global element 全局元素和局部元素的概念适用于使用名称空间的文档。 全局元素的名称与局部元素的名称放在一个单独的符号空间中。 全局元素是其类型具有全局作用域的元素,即其类型在相应XML模式的顶层定义的元素。 作为``元素的子元素的元素声明被认为是全局声明。 任何其他元素声明都是局部元素,除非它通过ref属性引用全局声明,这实际上使它成为全局元素。 属性可以是全局的,也可以是局部的。 ## local element 不是全局的XML元素。 局部元素不显式属于任何名称空间,除非元素是限定的。 参见限定元素和全局元素。 ## namespace 名称空间是为标识符定义域的惟一字符串,以便基于xml的应用程序不会混淆一种类型的文档和另一种类型的文档。 它通常以URL(统一资源位置)的形式给出一个URI(统一资源指示器),它可能与实际的web地址对应,也可能不对应。 例如,`“http://www.w3.org”`是一个名称空间。 使用以下语法之一包含命名空间声明: ```xml xmlns="your_namespace_here" pre:xmlns="your_namespace_here" ``` 在这两种情况下,名称空间只在插入名称空间声明的上下文中使用。 在后一种情况下,名称空间与给定的前缀(pre)相关联。 当且仅当元素或属性也有此前缀时,元素或属性就属于该名称空间。 例如: ```xml Ravazzolo,Roberta X. 1943-10-24 ``` 命名空间声明使用`s01`前缀。 ``元素也使用了这个前缀,所以这个元素属于这个名称空间。 但是,``和``元素并不显式地属于任何命名空间。 ## 处理指令(PI) 一种指令(在序言中),旨在告诉应用程序如何使用XML文档或如何处理它。 一个例子; 这将样式表与文档关联起来。 ```xml ``` ## prolog XML文档中根元素之前的部分。 序言以XML声明(指示使用的XML版本)开始,然后可能包括DTD声明或模式声明以及处理指令。 (从技术上讲,不需要`DTD`或模式。 此外,从技术上讲,可以将两者放在同一个文件中。) ## root, root element, document element 每个XML文档都要求在最外层只有一个元素。 这称为根元素、根元素或文档元素。 根元素在序言之后。 ## qualified 如果显式地将元素或属性分配给名称空间,则该元素或属性是限定的。 考虑下面的例子,其中``的元素和属性是不限定的: ```xml Frost,Sally O. 1957-03-11 ``` 在这里,名称空间声明使用`s01`前缀。 没有默认的命名空间。 ``元素也使用了这个前缀,因此该元素属于这个名称空间。 ``和``元素或``属性没有前缀,因此它们不显式属于任何名称空间。 相反,考虑以下情况,其中``的元素和属性是限定的: ```xml Frost,Sally O. 1957-03-11 ``` 在本例中,``元素定义了一个默认名称空间,该名称空间应用于子元素和属性。 注意:XML模式属性`elementFormDefault`属性和`attributeFormDefault`属性控制在给定的模式中元素和属性是否被限定。 在InterSystems IRIS XML支持中,使用类参数来指定元素是否限定。 ## schema 一种为一组XML文档指定元信息的文档,可作为DTD的替代。 与DTD一样,可以使用模式来验证特定XML文档的内容。 对于某些应用程序,XML模式提供了与`dtd`相比的几个优势,包括: - XML模式是有效的XML文档,因此更容易开发操作模式的工具。 - XML模式可以指定一组更丰富的特性,并包含值的类型信息。 形式上,模式文档是符合W3 XML模式规范的XML文档(在`https://www.w3.org/XML/Schema`)。 它遵守XML规则,并使用一些额外的语法。 通常,文件的扩展名是`.xsd`。 ## style sheet 用XSLT编写的文档,描述如何将给定的XML文档转换为另一个XML或其他“人类可读”的文档。 ## text node 包含在开始元素和相应结束元素之间的一个或多个字符。 例如: ```xml sample text node ``` ## type 对数据解释的限制。 在XML模式中,每个元素和属性的定义对应于一个类型。 类型可以是简单的,也可以是复杂的。 每个属性都有一个简单类型。 简单类型还表示没有属性和子元素(只有文本节点)的元素。 复杂类型表示其他元素。 下面的模式片段展示了一些类型定义: ```xml ``` ## unqualified 如果没有显式地将元素或属性分配给名称空间,则该元素或属性是非限定的。 ## well-formed XML 遵循XML规则的XML文档或片段,例如有一个结束标记来匹配一个开始标记。 ## XML declaration 指示给定文档中使用的XML版本(以及可选的字符集)的语句。 如果包含,它必须是文档中的第一行。 一个例子: ```xml ``` ## XPath XPath (XML路径语言)是一种基于XML的表达式语言,用于从XML文档中获取数据。 结果可以是标量,也可以是原始文档的XML子树。 ## XSLT XSLT(可扩展样式表语言转换)是一种基于XML的语言,用于描述如何将给定的XML文档转换为另一个XML或其他“人类可读的”文档。
文章
姚 鑫 · 七月 8, 2021

第三十一章 检查命名空间和类

# 第三十一章 检查命名空间和类 类`%XML.Namespaces`提供了两个类方法,可用于检查XML命名空间及其包含的类: ## GetNextClass() ```java classmethod GetNextClass(namespace As %String, class As %String) as %String ``` 返回给定`XML`命名空间中给定类之后的下一个类(按字母顺序)。当没有更多的类时,此方法返回`NULL`。 ## GetNextNamespace() ```java classmethod GetNextNamespace(namespace As %String) as %String ``` 返回给定命名空间之后的下一个命名空间(按字母顺序)。当没有更多的命名空间时,此方法返回`NULL`。 在这两种情况下,只考虑当前的InterSystems IRIS命名空间。此外,映射的类也会被忽略。 例如,以下方法列出当前InterSystems IRIS命名空间的XML命名空间及其类: ```java ClassMethod WriteNamespacesAndClasses() { Set ns="" Set ns=##class(%XML.Namespaces).GetNextNamespace(ns) While ns '="" { Write !, "The namespace ",ns, " contains these classes:" Set cls="" Set cls=##class(%XML.Namespaces).GetNextClass(ns,cls) While cls '="" { Write !, " ",cls Set cls=##class(%XML.Namespaces).GetNextClass(ns,cls) } Set ns=##class(%XML.Namespaces).GetNextNamespace(ns) } } ``` 在终端中执行时,此方法会生成如下所示的输出: ```java The namespace http://www.address.org contains these classes: ElRef.NS.Address GXML.AddressNS MyApp4.Obj.Address MyAppNS.AddressNS Obj.Attr.Address Obj.Ns.Address Obj.Ns.AddressClass The namespace http://www.doctor.com contains these classes: GXML.DoctorNS The namespace http://www.one.org contains these classes: GXML.AddressNSOne GXML.DoctorNSOne GXML.PersonNSOne ... ```
文章
Claire Zheng · 七月 8, 2021

2021 CHITEC | InterSystems IRIS医疗版互联互通套件:六大能力助力医院互联互通建设

2021年7月9日-11日,2021(16th) 中国卫生信息技术/健康医疗大数据应用交流大会暨软硬件与健康医疗产品展览会(CHITEC)在武汉国际博览中心(湖北省武汉市汉阳区鹦鹉大道619号)盛大召开,欢迎莅临InterSystems展位A6-16,了解备受瞩目的InterSystems IRIS医疗版互联互通套件。 InterSystems致力于部署、创建互联互通医疗解决方案,为医院数字化转型提供技术支持。针对医院信息互联互通标准化成熟度测评指标要求,InterSystems IRIS 医疗版互联互通套件从安全管理、监控、数据管理、互联互通文档、互联互通服务、集成与交换六大方面助力医院互联互通建设,以满足医疗机构内部标准化的要求,使医院可基于信息平台提供较为完善的临床决策支持、闭环管理,实现丰富的人工智能和大数据应用,实现丰富的跨机构的业务协同和互联互通应用。 如果您希望进一步了解详细信息,欢迎莅临展位(A6-16),或通过下方二维码联系小助手,添加时注明“CHITEC预约沟通”,确认您的专属预约沟通时段,如果您完成预约并与专家实现现场沟通,将有机会获得神秘礼品! InterSystems IRIS医疗版互联互通套件具备如下优点: 专——专注医疗领域40余年,针对中国医疗信息化市场量身定制,遵循国家卫生信息标准,公立医院互联互通标准化成熟度测评需求的基石;加强健康数据标准应用,提高数据质量;全——全面支持2020最新版医院互联互通标准化成熟度测评规定的文档、监控、服务、Schema 等组件;快——卓越的互操作性助力医疗机构快速落地互联互通标准化成熟度测评标准化改造;省——有效缩短实施周期,降低实施成本,超高性能有效降低硬件成本;稳——稳定高效,连续多年支持超百家大型公立医院海量数据稳定运行。主流 PC 服务器单实例下,支持日消息吞吐量可达 27亿;目前已知支持国内公立医院日消息吞吐量高达1200万/天(非集群);强——功能强大,该套件具备持久化数据能力,可全面助力医院快速实现创新型数据应用,包括数据库管理、敏捷开发、 API 管理、FHIR资源仓库、分布式扩展、一体化机器学习、自适应分析等;广——广泛专业的本土化生态合作伙伴,具备丰富的互联互通成熟度测评经验与强大的落地能力。 截至2020 年,InterSystems已助力中南大学湘雅医院(五级乙等)、河南省人民医院(五级乙等)、安徽省立医院(五级乙等)、武汉中心医院(五级乙等)、四川大学华西第二医院(五级乙等)、深圳市宝安区妇幼保健院(五级乙等)、广州医科大学附属第二医院(五级乙等)、吉林大学中日联谊医院(五级乙等)、浙江大学医学院附属第四医院(五级乙等)、北京协和医院(四级甲等)等一百余家医院通过互联互通标准化成熟度测评,在全国大型医院中市场份额最高。 2021 CHITEC (7月9日-11日)期间,转发这篇文章到微信朋友圈,可以到InterSystems展位领取小礼品哦~
文章
姚 鑫 · 七月 7, 2021

第三十章 从类生成XML架构

# 第三十章 从类生成XML架构 本章介绍如何使用`%XML.Schema`从启用了XML的类生成XML架构。 # 概述 要生成为同一XML命名空间中的多个类定义类型的完整架构,请使用`%XML.Schema`构建架构,然后使用`%XML.Writer`为其生成输出。 # 从多个类构建架构 要构建XML架构,请执行以下操作: 1. 创建`%XML.Schema`实例。 2. 可以选择设置实例的属性: - 若要为任何其他未分配的类型指定命名空间,请指定`DefaultNamespace`属性。默认值为`NULL`。 - 默认情况下,类及其属性的类文档包含在模式的``元素中。 要禁用此功能,请将`IncludeDocumentation`属性指定为0。 注意:必须在调用`AddSchemaType()`方法之前设置这些属性。 3. 调用实例的`AddSchemaType()`方法。 ```java method AddSchemaType(class As %String, top As %String = "", format As %String, summary As %Boolean = 0, input As %Boolean = 0, refOnly As %Boolean = 0) as %Status ``` - class是支持xml的类的完整包名和类名。 - top 是可选的; 如果指定,它将覆盖该类的类型名。 - format指定此类型的格式。 它必须是`"literal"`(文字格式,默认),`"encoded"`(用于SOAP编码),`"encoded12"`(用于SOAP 1.2编码),或`"element"`。 值`“element”`与元素位于顶层的文字格式相同。 - summary,如果为true,将导致InterSystems IRIS启用xml的类的`XMLSUMMARY`参数。 如果指定了此参数,则模式将只包含该参数列出的属性。 - input,如果为true,将导致InterSystems IRIS获取输入模式,而不是输出模式。 在大多数情况下,输入模式和输出模式是相同的; 如果为类的属性指定`XMLIO`属性参数,则它们是不同的。 - refOnly如果为true,将导致InterSystems IRIS仅为引用的类型生成模式,而不是为给定的类和所有引用的类型生成模式。 这个方法返回一个应该被检查的状态。 4. 根据需要重复前面的步骤。 5. 如果要定义导入模式的位置,可以调用`DefineLocation()`方法。 ```java method DefineLocation(namespace As %String, location As %String) ``` namespace 是一个或多个引用类使用的名称空间,位置是对应模式(XSD文件)的URL或路径和文件名。 可以重复调用此方法来为多个导入的模式添加位置。 如果不使用这个方法,模式会包含一个``指令,但是不会给出模式的位置。 6. 要定义额外的``指令,可以调用`DefineExtraImports()`方法。 ```java method DefineExtraImports(namespace As %String, ByRef imports) ``` namespace是``指令应该添加到的命名空间,imports是一个多维数组,形式如下: Node| Value ---|--- `arrayname("namespace URI")` |字符串,给出此名称空间的模式(XSD文件)的位置。 # 为架构生成输出 按照上一节所述创建`%XML.Schema`的实例后,请执行以下操作以生成输出: 1. 调用实例的`GetSchema()`方法将架构作为文档对象模型(DOM)的节点返回。 此方法只有一个参数:模式的目标命名空间的URI。该方法返回`%XML.Node`的一个实例,该实例在“将XML文档表示为DOM”一章中介绍。 如果模式没有命名空间,请使用`“”`作为`GetSchema()`的参数。 2. 可以选择修改此DOM。 3. 要生成架构,请执行以下操作: a. 创建`%XML.Write`的实例,并可选择设置属性(如缩进)。 b. 可以选择调用编写器的`AddNamespace()`方法和其他方法,将名称空间声明添加到`` 元素。 因为架构可能引用简单的XSD类型,所以调用`AddSchemaNamespace()`来添加XML模式命名空间很有用。 c. 使用架构作为参数,调用编写器的`DocumentNode()`或`Tree()`方法。 # 示例 ## 简单的示例 第一个示例显示了基本步骤: ```java Set schemawriter=##class(%XML.Schema).%New() //添加类和包(例如) Set status=schemawriter.AddSchemaType("Facets.Test") //通过其URI(在本例中为NULL)检索架构 Set schema=schemawriter.GetSchema("") //create writer Set writer=##class(%XML.Writer).%New() Set writer.Indent=1 //use writer Do writer.DocumentNode(schema) ``` ## 更复杂的架构示例 ```java Class SchemaWriter.Person Extends (%Persistent, %XML.Adaptor) { Parameter NAMESPACE = "http://www.myapp.com"; Property Name As %Name; Property DOB As %Date(FORMAT = 5); Property PatientID as %String; Property HomeAddress as Address; Property OtherAddress as AddressOtherNS ; } ``` `Address`类定义在相同的XML名称空间(`“http://www.myapp.com”`)中,而`OtherAddress`类定义在不同的XML名称空间(`“http://www.other.com”`)中。 `Company`类也被定义在XML名称空间`“http://www.myapp.com”`中。 其定义如下: ```java Class SchemaWriter.Company Extends (%Persistent, %XML.Adaptor) { Parameter NAMESPACE = "http://www.myapp.com"; Property Name As %String; Property CompanyID As %String; Property HomeOffice As Address; } ``` 注意,不存在连接`Person`和`Company`类的属性关系。 要为命名空间`"http://www.myapp.com"`生成模式,我们可以使用以下方法: ```java ClassMethod Demo() { Set schema=##class(%XML.Schema).%New() Set schema.DefaultNamespace="http://www.myapp.com" Set status=schema.AddSchemaType("SchemaWriter.Person") Set status=schema.AddSchemaType("SchemaWriter.Company") Do schema.DefineLocation("http://www.other.com","c:/other-schema.xsd") Set schema=schema.GetSchema("http://www.myapp.com") //create writer Set writer=##class(%XML.Writer).%New() Set writer.Indent=1 Do writer.AddSchemaNamespace() Do writer.AddNamespace("http://www.myapp.com") Do writer.AddNamespace("http://www.other.com") Set status=writer.DocumentNode(schema) If $$$ISERR(status) {Do $system.OBJ.DisplayError() Quit } } ``` 输出如下: ```xml ``` 请注意以下几点: - 模式包括`Person`及其所有引用的类的类型,以及`Company`及其所有引用的类的类型。 - ``指令导入了`OtherAddress`类使用的命名空间; 因为我们使用了`DefineLocation()`,所以这个指令还指示了相应模式的位置。 - 因为我们在调用`DocumentNode()`之前使用了`AddSchemaNamespace()`和`AddNamespace()`,所以``元素包含了名称空间声明,它为这些名称空间定义了前缀。 - 如果我们没有使用`AddSchemaNamespace()`和`AddNamespace()`, ``将不会包含这些名称空间声明,模式将会如下所示: ```xml ... ```
文章
姚 鑫 · 七月 6, 2021

第二十九章 从XML架构生成类

# 第二十九章 从XML架构生成类 Studio提供了一个向导,该向导读取XML模式(从文件或URL),并生成一组支持XML的类,这些类对应于模式中定义的类型。 所有的类都扩展`%XML.Adaptor`。 指定一个包来包含类,以及控制类定义细节的各种选项。 向导还可以作为类方法使用,也可以使用该类方法。 在内部,SOAP向导在读取WSDL文档并生成web客户端或web服务时使用此方法; 注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用本书前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。 # 使用向导 要使用XML架构向导,请执行以下操作: 1. 选择 Tools > Add-Ins > XML Schema Wizard. ![image](/sites/default/files/inline/images/1_50.png) 2. 在第一个屏幕上,指定要使用的XML模式。 做以下其中一项: - 对于模式文件Schema File,选择Browse 以选择XML模式文件。 - 对于URL,指定模式的URL。 ![image](/sites/default/files/inline/images/2_30.png) 3. 选择Next。 下一个屏幕显示模式,以便可以验证选择了正确的模式。 ![image](/sites/default/files/inline/images/3_24.png) 4. 可选择以下选项: - 保留空类Keep Empty Classes,它指定是否保留没有属性的未使用的类。 如果选择此选项,则不会在向导结束时删除此类; 否则,将删除它们。 - “不创建数组属性”Create No Array Properties控制向导是否生成数组属性。 如果选择此选项,向导不会生成数组属性,而是生成另一个表单。 - 为可为空的元素生成XMLNIL属性参数,它控制向导是否为生成的类中适用的属性指定XMLNIL属性参数。 该选项适用于每个对应于用`nillable="true"`指定的XML元素的属性。 如果选择此选项,向导将向属性定义添加`XMLNIL=1`。 否则不添加该参数。 该参数的详细信息请参见将对象投影到XML中的“处理空字符串和空值”。 - 为可为空的元素生成`XMLNILNOOBJECT`属性参数,它控制向导是否为生成的类中适用的属性指定`XMLNILNOOBJECT`属性参数。 该选项适用于每个对应于用`nillable="true"`指定的XML元素的属性。 如果选择此选项,向导将向属性定义添加`XMLNILNOOBJECT=1`。 否则不添加该参数。 该参数的详细信息请参见将对象投影到XML中的“处理空字符串和空值”。 5. 选择Next。 下一个屏幕显示关于要生成的类的选项的一些基本信息。 6. 在这个屏幕上,指定以下选项: - 如果希望向导编译生成的类,可以选择“编译生成的类”。 - 可选择“添加NAMESPACE类参数”来指定`NAMESPACE`参数。 在本例中,`NAMESPACE`被设置为模式中`targetNamespace`的值。 如果不设置此选项,则不指定`NAMESPACE`。 建议在所有情况下都选择这个选项,因为每个支持XML的类都应该分配给一个XML名称空间。 (但是,为了向后兼容,可以将此选项清除。) - 如果希望生成的类是持久类,请选择Create persistent classes。然后类扩展`%Persistent`。 可以稍后在向导中针对各个类更改这一点。 - 如果生成持久类,可以选择如何处理由另一个` b`的``组成的`` a。当向导生成一个包含属性`a`的持久类时,该属性有三种可能的形式。 可以将其定义为对象列表、一对多关系(默认)或父子关系。 下表总结了这些选择: 在持久性类中为集合属性使用关系 |向多对关系添加索引 |使用父子关系|生成的属性A的形式 ---|---|---|--- selected (default)| not selected| not selected| 无索引的一对多关系 selected (default) |selected| not selected| 在多侧与索引的一对多关系 selected (default) |如果选择Use parent-child relationship,则忽略此选项| selected| 父子关系 not selected| not selected| not selected |List of objects 此外,如果未选择使用父子关系,则可以选择将`%OnDelete`方法添加到类以级联删除。如果选择此选项,当向导生成类定义时,它会在这些类中包含`%OnDelete()`回调方法的实现。生成的`%OnDelete()`方法删除类引用的所有持久对象。如确实选择了使用父子关系,请不要选择此选项;父子关系已经提供了类似的逻辑。 注意:如果修改生成的类,请确保根据需要修改`%OnDelete()`回调方法。 如果生成持久类,向导可以向每个对象类型类添加临时属性,以便可以为对象投影InterSystems IRIS内部标识符。选项如下: - None-如果选择此选项,向导不会添加此处描述的任何属性。 - Use Id -如果选择此选项,向导将向每个对象类型类添加以下属性: ``` Property %identity As %XML.Id (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient]; ``` - Use Oid -如果选择此选项,向导将向每个对象类型类添加以下属性: ``` Property %identity As %XML.Oid (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient]; ``` - Use GUID-如果选择此选项,向导将向每个对象类型类添加以下属性: ``` Property %identity As %XML.GUID (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient]; ``` 底部的表格列出了模式中的XML名称空间。在这里,指定包含该行中显示的XML名称空间的类的包。要执行此操作,请在程序包名字段中为该行指定程序包名。 7. 选择下一步。 8. 在下一个屏幕上,指定以下选项: - Java Enabled - 如果选择此选项,则每个类都包括一个Java映射。 - Data Population数据填充-如果选择此选项,则除`%XML.Adaptor`外,每个类还继承会`%Populate`。 - SQL Column Order-如果选择此选项,每个属性将为`SqlColumnNumber`关键字指定一个值,以便属性在SQL中的顺序与它们在架构中的顺序相同。 - No Sequence Check-如果选中此选项,向导将生成的类中的`XMLSEQUENCE`参数设置为0。在某些情况下,如果XML文件的元素顺序与XML架构不同,则此选项非常有用。 默认情况下,`XMLSEQUENCE`参数在生成的类中设置为1。这可确保属性以与架构中相同的顺序包含在类定义中。 - XMLIGNORENULL-如果选择此选项,向导会将`XMLIGNORENULL=1`添加到类定义中。否则,它不会添加此参数。 - 将流用于二进制Use Streams for Binary - 如果选择此选项,向导将为`xsd:base64Binary`类型的任何元素生成`%Stream.GlobalBinary`类型的属性。如果清除此选项,则该属性的类型为`%xsd.base64Binary`。 请注意,向导将忽略`xsd:base64Binary`类型的任何属性。 - 在复选框下方,该表列出了向导将生成的类。对于每个类,确保适当地设置了`Extensions/Type`。在此,可以选择以下选项之一: - 持久类`Persistent` -如果选择此选项,则类是持久性类。 - `Serial`-如果选择此选项,则类为序列类。 - `Registered Object`-如果选择此选项,则类为注册对象类。 所有生成的类还扩展`%XML.Adaptor`。 - 在表的右列中,为每个应编制索引的属性选择索引。 9. 选择Finish(完成)。 然后,向导将生成这些类,并在需要时编译它们。 对于这些类的属性,如果架构中相应元素的名称以下划线(_)开头,则属性名称以百分号(%)开头。 # 以编程方式生成类 XML架构向导也可用作`%XML.Utils.SchemaReader`类的`process()`方法。要使用此方法,请执行以下操作: 1. 创建`%XML.Utils.SchemaReader`的实例。 2. 可以选择设置实例的属性以控制其行为。 3. 可以选择创建InterSystems IRIS多维数组,以包含有关其他设置的信息。 4. 调用实例的`process()`方法: ``` method Process(LocationURL As %String, Package As %String = "Test", ByRef Features As %String) as %Status ``` - LocationURL必须是架构的URL或架构文件的名称(包括其完整路径)。 - Package是用于放置生成的类的包的名称。如果不指定程序包,InterSystems IRIS将使用服务名称作为程序包名称。 - Feature是在上一步中选择创建的多维数组。 # 每种XSD类型的默认IRIS数据类型 对于它生成的每个属性,XML架构向导会根据架构中指定的XSD类型自动使用适当的InterSystems IRIS数据类型类。下表列出了XSD类型和相应的InterSystems IRIS数据类型: 用于XML类型的InterSystems IRIS数据类型 源文档中的XSD类型 |生成的IRIS类中的数据类型 ---|--- anyURI | %xsd.anyURI base64Binary | `%xsd.base64Binary`或`%Stream.GlobalBinary`,具体取决于选择的选项。确定每个字符串是否可能超出字符串长度限制,如果可能,则将生成的属性从`%xsd.base64Binary`修改为适当的流类。) boolean | `%Boolean` byte | `%xsd.byte` date | `%Date` dateTime | `%TimeStamp` decimal |`%Numeric` double | `%xsd.double` float | `%xsd.float` hexBinary | `%xsd.hexBinary` int |`%xsd.int` integer |`%Integer` long | `%Integer` negativeInteger | `%xsd.negativeIntege` nonNegativeInteger | `%xsd.nonNegativeInteger` nonPositiveInteger |`%xsd.nonPositiveInteger` positiveInteger | `%xsd.positiveInteger` short | `%xsd.short` string | `%String` (注意:责任确定每个字符串是否可能超出字符串长度限制,如果可能,则将生成的类型修改为适当的流类。) time | `%Time` unsignedByte | `%xsd.unsignedByte` unsignedInt |`%xsd.unsignedInt` unsignedLong | `%xsd.unsignedLong` unsignedShort | `%xsd.unsignedShort` no type given | `%String` # 生成的属性的属性关键字 对于它生成的每个属性,XML架构向导还使用架构中的信息自动设置以下关键字: - Description - Required - ReadOnly (如果相应的元素或属性是用固定属性定义的) - InitialExpression (该值取自架构中的固定属性) - Keywords related to relationships # 生成的属性的参数 对于它生成的每个属性,XML架构向导会根据需要自动设置`XMLNAME`、`XMLPROJECTION`和所有其他与XML相关的参数。它还根据需要设置其他参数,如`MAXVAL`、`MINVAL`和`VALUELIST`。 # 调整为超长字符串生成的类 在极少数情况下,可能需要编辑生成的类来容纳超长的字符串或二进制值,超出字符串长度限制。 对于任何字符串类型,XML架构都不包含任何指示字符串长度的信息。XML架构向导将所有字符串值映射到InterSystems IRIS `%String`类,并将所有`base64Binary`值映射到`%xsd.base64Binary`类。这些选择可能不合适,具体取决于类要承载的数据。 在使用生成的类之前,应该执行以下操作: - 检查生成的类,找到定义为`%string`或`%xsd.base64Binary`的属性。考虑将在其中使用这些类的上下文,特别是这些属性。 - 如果认为`%string`属性可能需要包含超出字符串长度限制的字符串,请将该属性重新定义为适当的字符流。同样,如果认为`%xsd.base64Binary`属性可能需要包含超过相同限制的字符串,请将该属性重新定义为适当的二进制流。 - 另请注意,对于类型为`%string`、`%xsd.string`和`%BINARY`的属性,默认情况下,`MAXLEN`属性参数为`50`个字符。可能需要指定更高的限制才能进行正确的验证。 (对于`%xsd.base64Binary`类型的属性,`MAXLEN`为`“”`,这意味着不会通过验证检查长度。但是,字符串长度限制确实适用。)
文章
Claire Zheng · 七月 6, 2021

InterSystems Caché系统运维培训:InterSystems Caché系统高可用与数据库镜像

近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问祝麟讲解了“InterSystems Caché系统高可用与数据库镜像”。
文章
Michael Lei · 七月 6, 2021

使用 Yape 解包 pButtons - 更新说明和快速指南

如果一张图片胜过千言万语,那么一段视频又价值几何? 当然胜过敲一个帖子。 请在 [InterSystems Developers YouTube](https://www.youtube.com/c/InterSystemsDevelopers) 观看我的“Coding talks”: 1. 使用 Yape 分析 InterSystems IRIS 系统性能。 第 1 部分:安装 Yape   在容器中运行 Yape。 2. Yape 容器 SQLite iostat InterSystems 提取和绘制 pButtons 数据,包括时间范围和 iostat。 如果您需要一个简单的方法来捕获和查看 Caché 和 IRIS 以及系统性能指标,可以安排每天运行 pButtons 来轻松实现。 [我之前写过这方面的文章](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章)。 我经常需要查看客户系统以进行容量规划和性能检查,这就是我编写 Yape 并在 [GitHub](https://github.com/murrayo/yape "GitHub") 上提供它的原因。 我的 InterSystems 同事 Fabian 将 Yape 的内部结构带入了新方向,并[使其正式在容器中运行](https://community.intersystems.com/post/visualizing-data-jungle-part-iv-running-yape-docker-image)。 Fabian 已经离开 InterSystems,但我继续在 GitHub 上进行开源开发。 在过去一个月左右的时间里,我修复了一些操作系统命令格式错误,使日期处理更智能,在 vmstat 中添加了“Total CPU”图表(倒着看“id”导致我的脖子拉伤),以及其他修饰性更改。 如果您想为 Yape 做出贡献,它在 GitHub 上是开源的。 如果您有功能要求,请[通过建议页面](https://github.com/murrayo/yape/issues)告诉我。 另外,请查看 [Open Exchange 上的 Yape 应用程序](http://bit.ly/2WnqmSt)。 在接下来的几个月,我将分享工作流程中的其他一些技巧,并期望继续开发以使呈现的数据更加有用。 Yape 非常适合检查和查看昨天或过去一周发生的事件的趋势,但是您还需要实时监视和警报... 这里我也对将来的一些帖子做个预告 ;)  
文章
Michael Lei · 七月 6, 2021

精华文章--虚拟化大型数据库 - VMware CPU 容量规划

供应商或内部团队要求说明如何为 VMware vSphere 上运行的_大型生产数据库_进行 CPU 容量规划。 总的来说,在调整大型生产数据库的 CPU 规模时,有几个简单的最佳做法可以遵循: - 为每个物理 CPU 核心规划一个 vCPU。 - 考虑 NUMA 并按理想情况调整虚拟机规模,以使 CPU 和内存对于 NUMA 节点是本地的。 - 合理调整虚拟机规模。 仅在需要时才添加 vCPU。 通常,这会引出几个常见问题: - 由于使用超线程技术,VMware 创建的虚拟机的 CPU 数量可以是物理 CPU 数量的两倍。 那不就是双倍容量吗? 创建的虚拟机不应该有尽可能多的 CPU 吗? - 什么是 NUMA 节点? 我应该在意 NUMA 吗? - 虚拟机应该合理调整规模,但我如何知道什么时候合理? 我以下面的示例回答这些问题。 但也要记住,最佳做法并不是一成不变的。 有时需要做出妥协。 例如,大型生产数据库虚拟机很可能不适合 NUMA 节点,但我们会看到,其实是没问题的。 最佳做法是指必须针对应用程序和环境进行评估和验证的准则。 虽然本文中的示例是在 InterSystems 数据平台上运行的数据库,但概念和规则通常适用于任何大型(怪兽)虚拟机的容量和性能规划。 有关虚拟化最佳做法以及有关性能和容量规划的更多帖子,请参见 [InterSystems 数据平台和性能系列的其他帖子列表](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章)。 # 怪兽虚拟机 本帖主要是关于部署_怪兽虚拟机_,有时也称为 _Wide 虚拟机_。 高事务数据库的 CPU 资源要求意味着它们通常部署在怪兽虚拟机上。 > 怪兽虚拟机是指虚拟 CPU 或内存多于物理 NUMA 节点的虚拟机。 # CPU 架构和 NUMA 当前的英特尔处理器架构采用非统一内存架构 (NUMA)。 例如,本帖中用来运行测试的服务器有: - 两个 CPU 插槽,每个插槽一个 12 核处理器(英特尔 E5-2680 v3)。 - 256 GB 内存(16 条 16GB RDIMM) 每个 12 核处理器都有自己的本地内存(128GB RDIMM 及本地高速缓存),还可以访问同一主机中其他处理器上的内存。 每个由 CPU、CPU 高速缓存和 128GB RDIMM 内存组成的 12 核套装都是一个 NUMA 节点。 为了访问其他处理器上的内存,NUMA 节点通过快速互连来连接。 处理器上运行的进程访问本地 RDIMM 和缓存内存的延迟比跨互连访问其他处理器上的远程内存的延迟要低。 跨互连访问会增加延迟,因此性能不一致。 同样的设计也适用于具有两个以上插槽的服务器。 一台四插槽英特尔服务器有四个 NUMA 节点。 ESXi 了解物理 NUMA,ESXi CPU 调度器设计为优化 NUMA 系统的性能。 ESXi 使性能最大化的方法之一是在物理 NUMA 节点上创建数据本地性。 在我们的示例中,如果虚拟机有 12 个 vCPU,并且内存不到 128GB,ESXi 将分配该虚拟机在一个物理 NUMA 节点上运行。 这就形成了规则: > 如果可能,将虚拟机规模调整为使 CPU 和内存对于 NUMA 节点是本地的。 如果需要比 NUMA 节点规模大的怪兽虚拟机也没有问题,ESXi 可以很好地自动计算和管理要求。 例如,ESXi 将创建能够智能调度到物理 NUMA 节点上的虚拟 NUMA 节点 (vNUMA),以获得最佳性能。 vNUMA 结构对操作系统公开。 例如,如果您有一台具有两个 12 核处理器的主机服务器和一个具有 16 个 vCPU 的虚拟机,ESXi 可能会使用每个处理器上的 8 个物理核心来调度虚拟机 vCPU,操作系统(Linux 或 Windows)将看到两个 NUMA 节点。 同样重要的是,应合理调整虚拟机的规模,并且分配的资源不要超过所需的资源,否则会导致资源浪费和性能损失。 除了有助于调整 NUMA 的规模,具有高(但安全的)CPU 利用率的 12 vCPU 虚拟机比具有中低 CPU 利用率的 24 vCPU 虚拟机更高效、性能更好,特别是该主机上还有其他虚拟机需要调度并且争用资源时。 这也再次强化了该规则: > 合理调整虚拟机规模。 __注意:__英特尔和 AMD 的 NUMA 实现有区别。 AMD 每个处理器有多个 NUMA 节点。 我已经有一段时间没有在客户服务器中看到 AMD 处理器了,但是如果你有这些处理器,请检查 NUMA 布局,作为规划的一部分。 ## Wide 虚拟机和授权 为实现最佳 NUMA 调度,请配置 Wide 虚拟机; 2017 年 6 月更正:按每个插槽 1 个 vCPU 配置虚拟机。 例如,默认情况下,一个具有 24 个 vCPU 的虚拟机应配置为 24 个 CPU 插槽,每个插槽一个核心。 > 遵守 VMware 最佳做法规则。 请参见 [VMware 博客上的这篇文章以查看示例。 ](https://blogs.vmware.com/performance/2017/03/virtual-machine-vcpu-and-vnuma-rightsizing-rules-of-thumb.html) 该 VMware 博客文章进行了详细介绍,但是作者 Mark Achtemichuk 建议遵循以下经验法则: - 虽然有许多高级 vNUMA 设置,但只有极少数情况下需要更改其默认值。 - 总是将虚拟机 vCPU 数配置为反映每插槽核心数,直到超过单个物理 NUMA 节点的物理核心数。 - 当需要配置的 vCPU 数量超过 NUMA 节点中的物理核心数量时,将 vCPU 均匀分配到最少数量的 NUMA 节点上。 - 当虚拟机规模超过物理 NUMA 节点时,不要分配奇数数量的 vCPU。 - 不要启用 vCPU 热添加,除非您不介意禁用 vNUMA。 - 不要创建规模大于主机物理核心总数的虚拟机。 Caché 授权以核心数为准,因此这不是问题,但是对于除 Caché 以外的软件或数据库,指定虚拟机有 24 个插槽可能会对软件授权产生影响,因此必须与供应商核实。 # 超线程和 CPU 调度器 超线程 (HT) 经常在讨论中出现,我听过“超线程使 CPU 核心数量翻倍”。 这在物理层面上显然是不可能的,物理核心有多少就是多少。 超线程应该被启用,并会提高系统性能。 预计应用程序性能可能会提高 20% 或更多,但实际数字取决于应用程序和工作负载。 但肯定不会翻倍。 正如我在 [VMware 最佳实践](https://cn.community.intersystems.com/post/intersystems-数据平台和性能-–-第-9-篇-intersystems-iris-vmware-最佳实践指南)中所述,_调整大型生产数据库虚拟机规模_的一个很好的起点是假定 vCPU 拥有服务器上完整的物理核心专用资源 — 在进行容量规划时基本忽略超线程。 例如: > 对于一台 24 核主机服务器,可规划总共多达 24 个 vCPU 的生产数据库虚拟机,且可能还有余量。 在您花时间监测应用程序、操作系统和 VMware 在峰值处理期间的性能后,您可以决定是否进行更高度的虚拟机整合。 在最佳做法帖子中,我将规则表述为: > 一个物理 CPU(包括超线程)= 一个 vCPU(包括超线程)。 ## 为什么超线程不会使 CPU 翻倍 英特尔至强处理器上的超线程是在一个物理核心上创建两个_逻辑_ CPU 的方法。 操作系统可以有效地针对两个逻辑处理器进行调度 — 如果一个逻辑处理器上的进程或线程正在等待,例如等待 IO,则物理 CPU 资源可以被另一个逻辑处理器使用。 在任何时间点都只能有一个逻辑处理器运行,因此虽然物理核心得到了更有效的利用,但_性能并没有翻倍_。 在主机 BIOS 中启用超线程后,当创建虚拟机时,可以为每个超线程逻辑处理器配置一个 vCPU。 例如,在一台启用了超线程的物理 24 核服务器上,可以创建具有多达 48 个 vCPU 的虚拟机。 ESXi CPU 调度器将通过首先在独立的物理核心上运行虚拟机进程来优化处理(同时仍然考虑 NUMA)。 在以后的帖子中,我将探讨在怪兽数据库虚拟机上分配比物理核心数更多的 vCPU 是否有助于扩展。 ### 协同停止和 CPU 调度 在监测主机和应用程序性能后,您可以决定是否让主机 CPU 资源过载。 这是否是一个好主意在很大程度上取决于应用程序和工作负载。 了解调度器和要监测的关键指标有助于确保没有使主机资源过载。 我有时听说,要让虚拟机正常运行,空闲逻辑 CPU 的数量必须与虚拟机中的 vCPU 数量相同。 例如,一个 12 vCPU 虚拟机必须“等待”12 个逻辑 CPU“可用”,才能继续执行。 不过应该注意,ESXi 在版本 3 之后就不是这样了。 ESXi 对 CPU 使用宽松的协同调度,以提高应用程序性能。 由于多个协作线程或进程经常相互同步,不一起调度它们可能会增加操作的延迟。 例如,在自旋循环中,一个线程等待被另一个线程调度。 为了获得最佳性能,ESXi 尝试将尽可能多的同级 vCPU 一起调度。 但是,当有多个虚拟机在整合环境中争用 CPU 资源时,CPU 调度器可以灵活地调度 vCPU。 如果一些 vCPU 的进展比同级 vCPU 领先太多(这个时间差称为偏移),领先的 vCPU 将决定是否停止自身(协同停止)。 请注意,协同停止(或协同启动)的是 vCPU,不是整个虚拟机。 这种机制即使在资源有些过载的情况下也非常有效,但正如您所预期,CPU 资源过载太多将不可避免地影响性能。 我在后面的示例 2 中展示了一个过载和协同停止的例子。 记住,这不是虚拟机之间全力争夺 CPU 资源的竞赛;ESXi CPU 调度器的工作是确保 CPU 共享、保留和限制等策略被遵守,同时最大限度地提高 CPU 利用率,并确保公平性、吞吐量、响应速度和可伸缩性。 关于使用保留和共享来确定生产工作负载优先级的讨论不在本帖范围之内,而且取决于应用程序和工作负载组合。 如果我以后发现任何特定于 Caché 的建议,我可能会重新讨论这个话题。 有许多因素会影响到 CPU 调度器,本节只是简单提一下。 要深入了解,请参见帖子末尾的参考资料中的 VMware 白皮书及其他链接。 # 示例 为了说明不同的 vCPU 配置,我使用一个基于浏览器的高事务速率医院信息系统应用程序运行了一系列基准测试。 与 VMware 开发的 DVD 商店数据库基准测试的概念类似。 基准测试的脚本是根据现场医院实施的观测值和指标创建的,包括高使用率的工作流程、事务和使用最多系统资源的组件。 其他主机上的驱动虚拟机以设置的工作流程事务速率执行具有随机输入数据的脚本,来模拟 Web 会话(用户)。 1 倍速率的基准为基线。 速率可以按比例递增和递减。 除了数据库和操作系统指标外,一个很好的用来衡量基准数据库虚拟机性能的指标是在服务器上测量的组件(也可以是事务)响应时间。 一个组件示例是一部分最终用户屏幕。 组件响应时间增加意味着用户将开始看到应用程序响应时间变差。 性能良好的数据库系统必须为最终用户提供_一致的_高性能。 在下面的图表中,我针对一致的测试性能进行测量,并通过对 10 个最慢的高使用率组件的响应时间取平均值来表示最终用户体验。 预计平均组件响应时间为亚秒级,用户屏幕可能由一个组件组成,或者复杂的屏幕可能有多个组件。 > 请记住,您始终针对峰值工作负载进行规模调整,并且为意外的活动峰值留出缓冲区。 我通常以平均 80% 的峰值 CPU 利用率为目标。 基准测试硬件和软件的完整列表在帖子末尾。 ## 示例 1. 合理调整规模 - 每个主机一个怪兽虚拟机 可以创建一个可以使用主机服务器所有物理核心的数据库虚拟机,例如 24 物理核心主机上的 24 vCPU 虚拟机。 数据库虚拟机不会在 Caché 数据库镜像中“裸机”运行服务器以实现 HA,也不会引入操作系统故障转移集群的复杂性,而是包含在 vSphere 集群中实现管理和 HA,例如 DRS 和 VMware HA。 我见过有客户遵循老派的思维,根据五年硬件寿命结束时的预期容量来确定主数据库虚拟机的规模,但从上文可知,最好合理调整规模;如果虚拟机没有过度调整,性能和整合度会更好,并且管理 HA 将更容易;如果需要维护或主机出现故障,并且数据库怪兽虚拟机必须迁移或在其他主机上重启,想想俄罗斯方块的玩法就知道了。 如果预计事务速率显著增加,可以在计划维护期间提前增加 vCPU。 > 注意,“热添加”CPU 选项会禁用 vNUMA,因此不要将其用于怪兽虚拟机。 考虑下图显示的在 24 核主机上进行的一系列测试。 对于这个 24 核系统,3 倍事务速率是甜蜜点和容量规划目标。 - 主机上运行一个虚拟机。 - 使用了四种虚拟机规模来展示 12、24、36 和 48 vCPU 的性能。 - 尽可能对每种虚拟机规模都运行一系列事务速率(1 倍、2倍、3 倍、4 倍、5 倍)。 - 性能/用户体验以组件响应时间(条形图)的形式显示。 - 客户机虚拟机的 CPU 利用率百分比为平均值(线条)。 - 所有虚拟机规模中,主机 CPU 利用率都在 4 倍速率时达到 100%(红色虚线)。 ![24 物理核心主机 单个客户机虚拟机平均 CPU 百分比和组件响应时间 ](https://community.intersystems.com/sites/default/files/inline/images/single_guest_vm.png "单个客户机虚拟机") 这个图表中有许多信息,但我们可以关注几个有趣的事情。 - 24 vCPU 虚拟机(橙色)平稳地增加到目标 3 倍事务速率。 在 3 倍速率时,客户机内虚拟机的平均 CPU 利用率为 76%(峰值为 91% 左右)。 主机 CPU 利用率并不比客户机虚拟机高多少。 在 3 倍速率之前,组件响应时间非常稳定,因此用户很满意。 就我们的目标事务速率而言 — _这个虚拟机已合理调整规模_。 关于合理规模调整先说这么多,那么增加 vCPU 也就是使用超线程又会如何。 性能和可伸缩性有可能翻倍吗? 简短回答是_不可能!_ 在这种情况下,可以通过查看 4 倍以上速率的组件响应时间来了解答案。 虽然在分配了更多逻辑核心 (vCPU) 后性能“更好”,但仍然不平稳,不像 3 倍速率之前那样一致。 4 倍速率时,用户将报告响应时间变慢,无论分配多少个 vCPU。 请记住,在 4 倍速率时,_主机_曲线已经持平于 100% CPU 利用率,如 vSphere 所报告。 在 vCPU 数量较多的情况下,即使客户机内 CPU 指标 (vmstat) 报告低于 100% 利用率,对于物理资源来说情况也并非如此。 请记住,客户机操作系统不知道它是虚拟化的,它只是报告它所看到的资源。 另外,客户机操作系统也看不到超线程,所有 vCPU 都表现为物理核心。 关键是,数据库进程(在 3 倍事务速率时有 200 多个 Caché 进程)非常繁忙,并且非常高效地使用处理器,逻辑处理器没有很多空闲资源来调度更多工作,或将更多虚拟机整合到该主机。 例如,很大一部分 Caché 处理是在内存中进行的,因此没有很多 IO 等待。 所以,虽然可以分配比物理核心更多的 vCPU,但由于主机已经被 100% 利用,并不会获益许多。 Caché 非常擅长处理高工作负载。 即使主机和虚拟机的 CPU 利用率达到 100%,应用程序仍在运行,并且事务速率仍在提高 — 扩展不是线性的,如我们所见,响应时间越来越长,用户体验将受到影响 — 但应用程序不会“一落千丈”,尽管情况不是很好,但用户仍可以工作。 如果您的应用程序对响应时间不是那么敏感,那么很高兴地告诉您,您可以将其推向边缘甚至更远,并且 Caché 仍然可以安全地工作。 > 请记住,您不会想要以 100% CPU 运行数据库虚拟机或主机。 您需要容量来应对虚拟机的意外峰值和增长,而 ESXi 虚拟机监控程序需要资源来进行所有网络、存储和其他活动。 我总是针对 80% CPU 利用率的峰值进行规划。 即便如此,vCPU 的规模最多也只调整到物理核心数,这样即使在极端情况下,仍然有余量让 ESXi 虚拟机监控程序处理逻辑线程。 > 如果您运行超融合 (HCI) 解决方案,还必须考虑主机级别的 HCI CPU 要求。 有关详细信息,请参见我[先前关于 HCI](https://community.intersystems.com/post/intersystems-data-platforms-and-performance-%E2%80%93-part-8-hyper-converged-infrastructure-capacity "previous post on HCI") 的帖子。 部署在 HCI 上的虚拟机的基本 CPU 规模调整与其他虚拟机相同。 请记住,您必须在您自己的环境中使用您的应用程序验证和测试所有内容。 ## 示例 2. 资源过载 我看到过客户站点报告应用程序性能“慢”,而客户机操作系统却报告有空闲的 CPU 资源。 记住,客户机操作系统并不知道它是虚拟化的。 不幸的是,客户机内指标(例如 vmstat 在 pButtons 中报告的指标)可能具有欺骗性,您还必须获得主机级指标和 ESXi 指标(例如 `esxtop`)才能真正了解系统运行状况和容量。 如上面的图表所示,当主机报告 100% 利用率时,客户机虚拟机可能报告较低的利用率。 36 vCPU 虚拟机(红色)在 4 倍速率时报告 80% 平均 CPU 利用率,而主机报告 100%。 即使规模调整合理的虚拟机也可能出现资源短缺的情况,例如,如果在启动后有其他虚拟机迁移到主机上,或者由于 DRS 规则配置不当而导致资源过载。 为了显示关键指标,在下面的一系列测试中,我进行了以下配置: - 主机上运行两个数据库虚拟机。 - - 一个 24 vCPU 虚拟机以恒定的 2 倍事务速率运行(图表上未显示)。 - - 一个 24 vCPU 虚拟机以 1 倍、2 倍、3 倍事务速率运行(图表上显示这些指标)。 在另一个数据库使用资源的情况下;在 3 倍速率时,客户机操作系统 (RHEL 7) vmstat 只报告 86% 平均 CPU 利用率,运行队列大小平均只有 25。 然而,该系统的用户将大声抱怨,因为组件响应时间随着进程变慢而迅速增加。 如下图所示,协同停止和就绪时间说明了为什么用户性能如此糟糕。 就绪时间 (`%RDY`) 和协同停止 (`%CoStop`) 指标显示 CPU 资源在目标 3 倍速率下大幅过载。 这实际并不奇怪,因为_主机_以 2 倍速率运行(其他虚拟机),_而_该数据库虚拟机以 3 倍速率运行。 ![](https://community.intersystems.com/sites/default/files/inline/images/overcommit_3.png "过载的主机") 该图表明,当主机上的 总 CPU 负载增加时,就绪时间也会增加。 > 就绪时间是指虚拟机已准备好运行,但由于 CPU 资源不可用而无法运行的时间。 协同停止也会增加。 没有足够的空闲逻辑 CPU 来允许数据库虚拟机运行(正如我在上面的超线程部分详细说明的那样)。 最终结果是由于对物理 CPU 资源的争用而导致处理延迟。 我曾在一个客户站点看到过这种情况,当时通过 pButtons 和 vmstat 获取的支持视图只显示了虚拟化的操作系统。 虽然 vmstat 报告还有 CPU 余量,但用户的性能体验非常糟糕。 这里的教训是,直到 ESXi 指标和主机级视图可用,才能诊断出真正的问题;一般的集群 CPU 资源短缺导致的 CPU 资源过载,以及使情况变得更糟的不良 DRS 规则,会使高事务数据库虚拟机一起迁移并使主机资源不堪重负。 ## 示例 3. 资源过载 在此示例中,我使用了一个以 3 倍事务速率运行的基准 24 vCPU 数据库虚拟机,然后使用两个以恒定 3 倍事务速率运行的 24 vCPU 数据库虚拟机。 虚拟机的平均基准 CPU 利用率(见上面的示例 1)为 76%,主机则为 85%。 单个 24 vCPU 数据库虚拟机会使用全部 24 个物理处理器。 运行两个 24 vCPU 虚拟机意味着这两个虚拟机将争用资源,并使用服务器上的全部 48 个逻辑执行线程。 ![](https://community.intersystems.com/sites/default/files/inline/images/overcommit_2vm.png "过载的主机") 请记住,在运行单个虚拟机时,主机并没有被 100% 利用,我们仍然可以看到,当两个非常繁忙的 24 vCPU 虚拟机试图使用主机上的 24 个物理核心(即使开启了超线程)时,吞吐量和性能显著下降。 尽管 Caché 非常有效地使用了可用的 CPU 资源,但每个虚拟机的数据库吞吐量仍然下降了 16%,更重要的是,组件(用户)响应时间增加了 50% 以上。 ## 总结 本帖的目的是回答几个常见问题。 要深入了解 CPU 主机资源和 VMware CPU 调度器,请参见下面的参考部分。 虽然有许多专业级的调整,并且要深入研究 ESXi 才能榨干系统的最后一点性能,但基本规则非常简单。 对于_大型生产数据库_: - 为每个物理 CPU 核心规划一个 vCPU。 - 考虑 NUMA 并按理想情况调整虚拟机规模,以使 CPU 和内存对于 NUMA 节点是本地的。 - 合理调整虚拟机规模。 仅在需要时才添加 vCPU。 如果您想要整合虚拟机,请记住,大型数据库非常繁忙,在高峰期会大量使用 CPU(物理和逻辑)。 在您的监视系统告诉您安全之前,不要超额预定 CPU。 ## 参考 - [VMware 博客 - 怪兽虚拟机何时过载 vCPU:pCPU](https://blogs.vmware.com/vsphere/2014/02/overcommit-vcpupcpu-monster-vms.html) - [2016 NUMA 深入研究系列介绍](http://frankdenneman.nl/2016/07/06/introduction-2016-numa-deep-dive-series) - [VMware vSphere 5.1 中的 CPU 调度器](http://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/techpaper/vmware-vsphere-cpu-sched-performance-white-paper.pdf) ## 测试 我在一个 vSphere 集群上运行了本帖中的示例,该集群包括连接到一个全闪存阵列的双处理器 Dell R730。 在示例运行期间,网络或存储没有出现瓶颈。 - Caché 2016.2.1.803.0 PowerEdge R730 - 2 个 Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz - 16 条 16GB RDIMM,2133 MT/s,双列,x4 数据宽度 - SAS 12Gbps HBA 外部控制器 - 超线程 (HT) 开启 PowerVault MD3420,12G SAS,2U-24 驱动器 - 24 个 960GB 固态硬盘 SAS 读取密集型 MLC 12Gbps 2.5 英寸热拔插驱动器,PX04SR - 2 个控制器,12G SAS,2U MD34xx,8G 缓存 VMware ESXi 6.0.0 build-2494585 - 按照最佳实践配置虚拟机;VMXNET3、PVSCSI 等 RHEL 7 - 大页面 基准 1 倍速率下平均每秒 700,000 gloref(每秒数据库访问次数)。 24 vCPU 在 5 倍速率下平均每秒超过 3,000,000 gloref。 测试以老化方式进行,直到达到稳定的性能,然后进行 15 分钟采样并取平均值。 > 这些示例只是为了说明理论,您必须使用自己的应用程序进行验证!
文章
姚 鑫 · 七月 5, 2021

第二十八章 定制SAX解析器创建自定义内容处理程序

[toc] # 第二十八章 定制SAX解析器创建自定义内容处理程序 # 创建自定义内容处理程序 如果直接调用InterSystems IRIS SAX解析器,则可以根据自己的需要创建自定义内容处理程序。本节讨论以下主题: - Overview - 要在内容处理程序中自定义的方法的描述 - `%XML.SAX.Parser`类中解析方法的参数列表摘要 - 示例 ## 创建自定义内容处理程序概述 要定制InterSystems IRIS SAX解析器导入和处理XML的方式,请创建并使用定制的SAX内容处理程序。具体地说,创建`%XML.SAX.ContentHandler`的子类。然后,在新类中,重写任何默认方法以执行所需的操作。在解析XML文档时使用新的内容处理程序作为参数;为此,需要使用`%XML.SAX.Parser`类的解析方法。 此操作如下图所示: ![image](/sites/default/files/inline/images/tu_pian__6.png) 创建和使用自定义导入机制的过程如下: 1. 创建扩展`%XML.SAX.ContentHandler`的类。 2. 在该类中,包括希望覆盖的方法,并根据需要提供新定义。 3. 在使用`%XML.SAX.Parser`的分析方法之一(即`ParseFile()`、`ParseStream()`、`ParseString()`或`ParseURL()`)编写读取XML文档的类方法。 调用分析方法时,请将自定义内容处理程序指定为参数。 ## SAX内容处理程序的可定制方法 `%XML.SAX.ContentHandler`类在特定时间自动执行某些方法。通过覆盖它们,您可以自定义内容处理程序的行为。 ### 响应事件 `%XML.SAX.ContentHandle`类分析XML文件,并在它到达XML文件中的特定点时生成事件。根据事件的不同,会执行不同的方法。这些方法如下: - `OnPostParse()` — 在XML解析完成时触发。 - `characters()` — 由字符数据触发。 - `comment()` — 注释触发 - `endCData()` —由CDATA部分的末尾触发。 - `endDocument()` —由文档结尾触发。 - `endDTD()` — 由DTD结束触发。 - `endElement()` —由元素的末尾触发。 - `endEntity()` — 由一个实体的终结触发。 - `endPrefixMapping()` — 由名称空间前缀映射的结束触发。 - `ignorableWhitespace()` — 由元素内容中的可忽略空格触发。 - `processingInstruction()` — 由XML处理指令触发。 - `skippedEntity()` — 被跳过的实体触发。 - `startCData()` —由CDATA部分的开头触发。 - `startDocument()` — 由文档的开头触发。 - `startDTD()` — 由DTD的开头触发。 - `startElement()` — 由元素的开始触发。 - `startEntity()` — 由一个实体的开始触发。 - `startPrefixMapping()` — 由名称空间前缀映射的开始触发。 默认情况下,这些方法是空的,可以在自定义内容处理程序中覆盖它们。 ### 处理错误 `%XML.SAX.ContentHandler`类在遇到某些错误时也会执行方法: - `error()` — 由可恢复的解析器错误触发。 - `fatalError()` — 由致命的XML解析错误触发。 - `warning()` — 由解析器警告通知触发。 默认情况下,这些方法为空,可以在自定义内容处理程序中重写它们。 ### 计算事件掩码 当调用InterSystems IRIS SAX解析器(通过`%XML.SAX.Parser`类)时,可以指定一个掩码参数来指示哪些回调是感兴趣的。如果未指定掩码参数,解析器将调用内容处理程序的`Mask()`方法。此方法返回一个整数,该整数指定与内容处理程序的重写方法相对应的复合掩码。 例如,假设创建了一个自定义内容处理程序,其中包含`startElement()`和`endElement()`方法的新版本。在本例中,`Mask()`方法返回一个数值,该数值等于`$$$SAXSTARTELEMENT`和`$$$SAXENDELEMENT`,之和,这两个标志对应于这两个事件。如果没有为解析方法指定掩码参数,则解析器将调用内容处理程序的`Mask()`方法,因此只处理这两个事件。 ### 其他有用的方法 `%XML.SAX.ContentHandler`类提供在特殊情况下有用的其他方法: - `LocatePosition()`-通过引用返回两个参数,这两个参数指示解析的文档中的当前位置。第一个表示行号,第二个表示行偏移。 - `PushHandler()`-在堆栈上推送新的内容处理程序。SAX的所有后续回调都将转到这个新的内容处理程序,直到该处理程序完成处理。 如果在解析一种类型的文档时遇到想要以不同方式解析的一段XML,则可以使用此方法。在本例中,当检测到要以不同方式处理的段时,调用`PushHandler()`方法,该方法将创建一个新的内容处理程序实例。所有回调都会转到此内容处理程序,直到调用`PopHandler()`返回上一个内容处理程序。 - `PopHandler()`-返回堆栈上的上一个内容处理程序。 这些是`final`方法,不能重写。 ## SAX解析方法的参数列表 要指定文档源,请使用`%XML.SAX.Parser`类的`ParseFile()`、`ParseStream()`、`ParseString()`或`ParseURL()`方法。在任何情况下,源文档都必须是格式良好的XML文档;也就是说,它必须遵守XML语法的基本规则。完整的参数列表按顺序如下: 1. pFilename, pStream, pString, or pURL — 文档源. 2. pHandler — 内容处理程序,它是`%XML.SAX.ContentHandler`类的实例。 3. pResolver — 分析源时使用的实体解析器。 4. pFlags — 用于控制SAX解析器执行的验证和处理的标志。 5. pMask — 用于指定XML源中感兴趣的项的掩码。通常不需要指定此参数,因为对于`%XML.SAX.Parser`的解析方法,默认掩码为`0`。这意味着解析器调用内容处理程序的`Mask()`方法。该方法通过检测(在编译期间)在事件处理程序中自定义的所有事件回调来计算掩码。只处理那些事件回调。 6. pSchemaSpec — 验证文档源所依据的架构规范。此参数是一个字符串,其中包含以逗号分隔的命名空间/URL对列表: ``` "namespace URL,namespace URL" ``` 这里,`Namespace`是用于模式的XML名称空间,`URL`是提供模式文档位置的`URL`。名称空间和`URL`值之间有一个空格字符。 7. pHttpRequest (For the ParseURL() method only) — 这里,`Namespace`是用于模式的XML名称空间,URL是提供模式文档位置的URL。名称空间和URL值之间有一个空格字符。 8. pSSLConfiguration — 客户端`SSL/TLS`配置的配置名称。 注意:请注意,此参数列表与`%XML.TextReader`类的解析方法略有不同。有一点不同,`%XML.TextReader`不提供指定自定义内容处理程序的选项。 ## SAX处理程序示例 想要一个文件中出现的所有XML元素的列表。要做到这一点,只需记录每个开始元素。那么这个过程是这样的: 1. 创建一个名为`MyApp.Handler`的类,它扩展`%XML.SAX.ContentHandler`: ``` Class MyApp.Handler Extends %XML.SAX.ContentHandler { } ``` 2. 使用以下内容覆盖`startElement()`方法: ``` Class MyApp.MyHandler extends %XML.SAX.ContentHandler { // ... Method startElement(uri as %String, localname as %String, qname as %String, attrs as %List) { //we have found an element write !,"Element: ",localname } } ``` 3. 将一个类方法添加到读取和分析外部文件的Handler类: ``` Class MyApp.MyHandler extends %XML.SAX.ContentHandler { // ... ClassMethod ReadFile(file as %String) as %Status { //create an instance of this class set handler=..%New() //parse the given file using this instance set status=##class(%XML.SAX.Parser).ParseFile(file,handler) //quit with status quit status } } ``` 请注意,这是一个类方法,因为它在应用程序中被调用以执行其处理。此方法执行以下操作: 1. 它创建内容处理程序对象的实例: ``` set handler=..%New() ``` 2. 它在一个调用`%XML.SAX.Parser`的`ParseFile()`方法。这将验证并解析文档(由`fileName`指定),并调用内容处理程序对象的各种事件处理方法: ``` set status=##class(%XML.SAX.Parser).ParseFile(file,handler) ``` 每次在解析器解析文档时发生事件(如开始或结束元素)时,解析器都会调用内容处理程序对象中的适当方法。在本例中,唯一被覆盖的方法是`startElement()`,它随后写出元素名称。对于其他事件,例如到达`End`元素,不会发生任何事情(默认行为)。 3. 当`ParseFile()`方法到达文件末尾时,它返回。处理程序对象超出作用域,并自动从内存中删除。 4. 在应用程序中的相应点,调用`ReadFile()`方法,将文件传递给解析: ``` Do ##class(Samples.MyHandler).ReadFile(filename) ``` 其中,filename是正在读取的文件的路径。 例如,如果文件的内容如下: ``` Edwards,Angela U. 1980-04-19 K8134 Vail 94059 Uberoth,Wilma I. Wells,George H. ``` 则此示例的输出如下所示: ``` Element: Root Element: Person Element: Name Element: DOB Element: GroupID Element: HomeAddress Element: City Element: Zip Element: Doctors Element: Doctor Element: Name Element: Doctor Element: Name ``` # 使用HTTPS `%XML.SAX.Parser`支持`HTTPS`。也就是说,可以使用此类执行以下操作: - (对于`ParseURL()`)解析`HTTPS`位置提供的XML文档。 - (对于所有解析方法)解析`HTTPS`位置的实体。 在所有情况下,如果这些项目中的任何一个是`在HTTPS`位置上提供的,请执行以下操作: 1. 使用管理门户创建包含所需连接详细信息的`SSL/TLS`配置。这是一次性的步骤。 2. 调用`%XML.SAX.Parser`的适用解析方法时,请指定`pSSLConfiguration`参数。 默认情况下,InterSystems IRIS使用`Xerces`图元解析。`%XML.SAX.Parser`仅在以下情况下使用其自己的实体解析: - `PSSLConfiguration`参数非空。 - 已配置代理服务器。
文章
Michael Lei · 七月 4, 2021

Gartner DBMS 魔力象限中的主要领先数据库产品功能对比

大家好, 在本文中,我比较了 Gartner 最新DBMS 魔力象限中的主要领先数据库产品的功能。 请见按现有功能数量排序的列表。 1. InterSystems IRIS 2020.3 - 60 个功能 (https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls) 2. Oracle Database 21c - 54 个功能 (https://docs.oracle.com/en/database/oracle/oracle-database/index.html) 3. Microsoft SQL Server - 45 个功能 (https://docs.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver15) 4. AWS Aurora - PostgreSQL - 34 个功能 (https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 我只比较了功能,未进行任何性能比较(关于此内容,请参见性能测试:https://cn.community.intersystems.com/post/intersystems-iris%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0%EF%BC%9A%E6%95%B0%E6%8D%AE%E6%8E%A5%E6%94%B6%E9%80%9F%E5%BA%A6%E6%B5%8B%E8%AF%95)。 我使用了上面的产品官方文档链接。 请见比较表格: <colgroup><col style="width:245pt" width="327"><col style="width:88pt" width="118"><col style="width:122pt" width="162"><col style="width:150pt" width="200"><col style="width:146pt" width="195"></colgroup> 功能 InterSystemsIRIS 2020.3 OracleDatabase 21c MicrosoftSQL Server 2020 AWS Aurora -PostgreSQL 故障转移集群 有 有 有 有 镜像/数据复制 有 有 有 有 分布式缓存/内存中支持 有 有 有 有 备份/恢复 - 增量和完整 有 有 有 有 纵向缩放 有 有 有 有 针对 Insert、Update 和 Delete 进行横向缩放 有 有 无 无 针对 Select 进行横向缩放 有 有 有 有 分片集群 有 有 无 有 云支持和云管理器 有 有 有 有 Kubernetes 支持和 Kubernetes 管理器 有 有 有 有 Docker 支持 有 有 有 无 AWS 托管 有 有 有 有 Azure 托管 有 有 有 无 Google Cloud 托管 有 有 有 无 托管云 有 有 有 有 内部部署支持 有 有 有 无 多模型 - OO 有 无 无 无 多模型 - 文档 - JSON 有 有 有 有 多模型 - XML 有 有 有 有 多模型 - 键/值 有 无 无 无 多模型 - SQL 有 有 有 有 多模型 - 空间 无 有 有 有 多模型 - 图表 无 有 有 无 多模型 - OLAP 多维数据集 有 有 有 无 GIS 平台 无 有 无 无 本机 OO 编程语言 有 有 无 无 Java、.Net、Python、C/C++ 和 PHP 支持 有 有 有 有 Node.js 支持 有 有 有 有 ODBC/JDBC 支持 有 有 有 有 后端应用程序开发 有 有 无 无 前端应用程序开发 有 有 无 无 低代码 Web 应用程序开发 无 有 有 无 数据库应用程序开发 有 有 有 有 OData 支持 无 有 有 无 REST 服务 有 有 有 有 SOAP 服务 有 无 无 无 终端工具 有 有 有 有 IDE 支持 有 有 有 有 Web 管理/IDE 支持 有 有 有 有 嵌入 NLP 有 无 无 无 嵌入 AutoML 有 无 无 无 R/机器学习支持 有 有 有 有 PMML 有 无 无 无 业务报表服务器/开发 有 有 有 无 自主 AI 操作 无 有 无 无 非结构化文本注释/类似 Apache UIMA 有 有 无 无 Spark 支持 有 有 有 有 BI 工具 有 无 有 无 MDX 支持 有 有 有 无 互操作性连接器 有 无 无 无 BPEL/集成编排/工作流 有 无 无 无 ETL - 提取、转换和加载数据 有 无 无 无 IoT/MQTT 支持 有 无 无 无 EDI 支持 有 无 无 无 ESB 有 无 无 无 CDC - 变更数据捕获 有 有 有 有 RBAC 模型 有 有 有 有 LDAP 支持 有 有 有 有 双因素授权/身份验证支持 有 有 有 有 加密 有 有 有 有 标记 有 有 有 无 审计和跟踪 有 有 有 有 SAM 有 有 有 有 多操作系统支持 有 有 有 有 SAML/Oauth/OpenID 支持 有 有 有 有 性能调整 IDE/包 无 有 无 无 特权用户访问管理 无 有 无 无 API 管理 有 无 无 无 功能总数 61 54 45 34