InterSystems Caché 是一个多模型 DBMS 和应用服务器。
查看此处提供的更多详细信息。
文档。
近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问祝麟讲解了“InterSystems Caché系统高可用与数据库镜像”。
如果一张图片胜过千言万语,那么一段视频又价值几何? 当然胜过敲一个帖子。
请在 InterSystems Developers YouTube 观看我的“Coding talks”:
1. 使用 Yape 分析 InterSystems IRIS 系统性能。 第 1 部分:安装 Yape
在容器中运行 Yape。
2. Yape 容器 SQLite iostat InterSystems
提取和绘制 pButtons 数据,包括时间范围和 iostat。
供应商或内部团队要求说明如何为 VMware vSphere 上运行的_大型生产数据库_进行 CPU 容量规划。
总的来说,在调整大型生产数据库的 CPU 规模时,有几个简单的最佳做法可以遵循:
通常,这会引出几个常见问题:
我以下面的示例回答这些问题。 但也要记住,最佳做法并不是一成不变的。 有时需要做出妥协。 例如,大型生产数据库虚拟机很可能不适合 NUMA 节点,但我们会看到,其实是没问题的。 最佳做法是指必须针对应用程序和环境进行评估和验证的准则。
除了objectscript 自带的 list,array 数据结构以外,是否有存在其它已经实现好的数据结构,类似 java 里面 collection包一样,是否有已经实现好的排序工具,有没有针对集合类的sort工具。
(ECP) Caché 出色的可用性和扩展特性之一是企业缓存协议 (ECP)。 在应用程序开发过程中,如对使用 ECP 的分布式处理加以考虑,可以横向扩展 Caché 应用程序的架构。 应用程序处理可以调整为非常高的速率,处理能力从单个应用程序服务器扩展到最多 255 个应用程序服务器,并且不需要任何应用程序更改。
在我参与的 TrakCare 部署中,ECP 已广泛使用多年。 十年前,主要供应商之一的一台“大型”x86 服务器可能总共只有八个核心。 对于大型部署来说,ECP 是横向扩展商业服务器处理能力的方式,不适合单台昂贵的大型企业服务器。 即使是高核心数的企业服务器也有限制,因此 ECP 也用于扩展这些服务器上的部署。
如今,大多数的新 TrakCare 部署或升级到当前硬件_不需要 ECP_ 即可扩展。 目前的双插槽 x86 生产服务器可以拥有数十个核心和巨大容量的内存。 我们看到,在最近的 Caché 版本中,TrakCare 以及许多其他 Caché 应用程序具有可预测的线性扩展能力,能够随着单台服务器中 CPU 核心数量和内存的增加而支持逐渐增多的用户和事务。 在现场,我看到大多数的新部署都是虚拟化的,即使如此,虚拟机也可以根据需要扩展到主机服务器的规模。 如果资源需求超过单个物理主机可以提供的资源,则使用 ECP 进行横向扩展。
XML文档可能包含对外部DTD或其他实体的引用。默认情况下,InterSystems IRIS尝试查找这些实体的源文档并解析它们。要控制InterSystems IRIS解析外部实体的方式,请使用以下步骤:
此类必须在扩展%XML.SAX.EntityResolver,并且必须实现 resolveEntity()方法,该方法具有以下签名:
method resolveEntity(publicID As %Library.String, systemID As %Library.String) as %Library.Integer
每当XML处理器找到对外部实体(如DTD)的引用时,就会调用该方法;这里的public ID和systemID是该实体的Public和系统标识符字符串。
该方法应获取实体或文档,将其作为流返回,然后在将流包装在%XML.SAX.StreamAdapter的实例中。此类提供了用于确定流特征的必要方法。
如果无法解析该实体,则该方法应返回$$$NULLOREF ,以向SAX解析器指示该实体无法解析)。
尽管方法签名指示返回值为%Library.Integer,但该方法应返回%XML.SAX.StreamAdapter的实例或该类的子类。
每当InterSystems IRIS读取XML文档时,它都会使用InterSystems IRIS SAX(Simple API For XML)解析器。本章介绍用于控制系统间IRIS SAX解析器的选项。
每当InterSystems IRIS读取XML文档时,都会使用InterSystems IRIS SAX解析器。
它是一个事件驱动的XML解析器,读取XML文件,并在找到感兴趣的项(如XML元素的开始、DTD的开始等)时发出回调。
(更准确地说,解析器与内容处理程序协同工作,内容处理程序发出回调。只有在自定义SAX接口时,此区别才很重要,如本章后面的“创建自定义内容处理程序”中所述。)
解析器使用标准Xerces-C++库,该库符合XML1.0推荐标准和许多相关标准。
可以通过以下方式控制SAX解析器的行为:
请注意,解析器始终检查文档是否为格式良好的XML文档。
当出现错误时,XSLT处理器(Xalan或Saxon)执行当前错误处理程序的error()方法,将消息作为参数发送到该方法。类似地,当发生致命错误或警告时,XSLT处理器会根据需要执行datalError()或Warning()方法。
对于所有这三种方法,默认行为是将消息写入当前设备。
要自定义错误处理,请执行以下操作:
Xalan或Saxon处理器,在创建%XML.XSLT.ErrorHandler的子类。在这个子类中,根据需要实现Error()、FatealError()和Warning()方法。这些方法中的每一个都接受单个参数,即包含由XSLT处理器发送的消息的字符串。
这些方法不返回值。
Transform方法的参数列表中使用它。要指定样式表使用的参数,请执行以下操作:
%ArrayOfDataTypes的实例在。SetAt()方法将参数及其值添加到此实例。对于SetAt(),将第一个参数指定为参数值,将第二个参数指定为参数名称。根据需要添加任意多个参数。
要执行XSLT转换,请执行以下操作:
Xalan处理器(对于XSLT 1.0),请使用%XML.XSLT.Transformer的以下类方法之一:
TransformFile()——转换给定XSLT样式表的文件。TransformFileWithCompiledXSL()——转换一个文件,给定一个已编译的XSLT样式表。TransformStream()——转换给定XSLT样式表的流。TransformStreamWithCompiledXSL()——转换一个流,给定一个已编译的XSLT样式表。TransformStringWithCompiledXSL()——转换给定已编译XSLT样式表的字符串。Saxon处理器(用于XSLT 2.0),请使用%XML.XSLT2.Transformer的以下类方法之一:
TransformFile()——转换给定XSLT样式表的文件。TransformFileWithCompiledXSL()——转换一个文件,给定一个已编译的XSLT样式表。TransformStream()——转换给定XSLT样式表的流。TransformStreamWithCompiledXSL()——转换一个流,给定一个已编译的XSLT样式表。XSLT(Extensible StyleSheet Language Transformations,可扩展样式表语言转换)是一种基于XML的语言,用于描述如何将给定的XML文档转换为另一个XML或其他“人类可读”的文档。可以使用%XML.XSLT和%XML.XSLT2包中的类来执行XSLT 1.0和2.0转换。
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码, IRIS将使用本书前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
IRIS提供两个XSLT处理器,每个处理器都有自己的API:
Xalan处理器支持XSLT 1.0。XML.XSLT包为该处理器提供API。Saxon处理器支持XSLT 2.0。%XML.XSLT2程序包为该处理器提供API。XML.XSLT2 API通过到XSLT 2.0网关的连接向Saxon发送请求。网关允许多个连接。这意味着,例如,可以将两个独立的 IRIS进程连接到网关,每个进程都有自己的一组编译样式表,同时发送转换请求。
XPath(XML路径语言)是一种基于XML的表达式语言,用于从XML文档获取数据。使用类中的%XML.XPATH.Document,可以轻松地计算XPath表达式(给定提供的任意XML文档)。
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用本书前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
要使用InterSystems IRIS XML支持使用任意XML文档计算XPath表达式,请执行以下操作:
%XML.XPATH.Document的实例。为此,请使用以下类方法之一:CreateFromFile()、CreateFromStream()或CreateFromString()``。使用这些方法中的任何一种,都可以将输入XML文档指定为第一个参数,并接收%XML.XPATH.Document的一个实例作为输出参数。这一步使用内置的XSLT处理器解析XML文档。
%XML.XPATH.Document实例的EvaluateExpression()方法。对于此方法,需要指定节点上下文和要计算的表达式。为什么我用webservice上传文件比csp上传文件快?
webservice用的soap协议也得走http呀。csp直接处理http,少了xml的封装,按理来说应该更快。
经测试,1M的文件,csp慢了0.1s左右。在网关连接到1972后,有0.1s左右的停滞,不知道原因。
有什么办法能够使csp的文件上传速度比webservice快吗?
要在文档中导航,请使用文本阅读器的以下方法:Read()、ReadStartElement()、MoveToAttributeIndex()、MoveToAttributeName()、MoveToElement()、MoveToContent()和Rewind()。
要移动到文档中的下一个节点,请使用read()方法。Read()方法返回TRUE值,直到没有更多节点可读为止(即,直到到达文档末尾)。前面的示例在如下所示的循环中使用了此方法:
While (textreader.Read()) {
...
}
可以移动到文档中特定元素的第一个匹配项。为此,请使用ReadStartElement()方法。除非找不到元素,否则此方法返回TRUE。如果未找到该元素,则该方法到达文件末尾。
ReadStartElement()方法有两个参数:元素的名称和命名空间URI(可选)。请注意,类中的%XML.TextReader不会对命名空间前缀进行任何处理。因此,ReadStartElement()方法将以下两个元素视为具有不同的名称:
如前所述,类中的%XML.TextReader解析XML文档并创建一个text reader对象,该对象由一组与文档组件相对应的节点组成;节点类型在本章前面的“文档节点”中进行了描述。
当将焦点更改到其他节点时,text reader对象的属性将更新,以包含有关当前检查的节点的信息。本节介绍类中%XML.TextReader的所有属性。
如果当前节点是元素或属性,则此属性指示元素的属性数。在给定元素中,第一个属性编号为1。对于任何其他类型的节点,此属性为0。
指示文档中当前节点的深度。根元素位于深度1;根元素之外的项位于深度0。请注意,属性与其所属元素的深度相同。同样,错误或警告与导致错误或警告的项的深度相同。
如果读取器已到达源文档的末尾,则为true;否则为false。
如果当前节点是一个元素,则如果该元素具有属性,则此属性为true(如果没有属性,则为false)。如果当前节点是属性,则此属性为true。对于任何其他类型的节点,此属性为False。
如果当前节点是具有值的节点类型(即使该值为空),则为True。否则,此属性为false。具体地说,对于以下类型的节点,此属性为真:
%XML.TextReader类提供了一种简单、容易的方法来读取可能直接映射到InterSystems IRIS对象,也可能不直接映射到InterSystems IRIS对象的任意XML文档。具体地说,该类提供了导航格式良好的XML文档并查看其中信息(元素、属性、注释、名称空间URI等)的方法。该类还基于DTD或XML架构提供完整的文档验证。但是,与%XML.Reader不同的是,%XML.TextReader不提供返回DOM的方法。如果需要DOM,请参阅前面的“将XML导入对象”一章。
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
Text Reader方法本章介绍如何向XML文档添加数字签名。
数字签名的XML文档包括一个或多个<Signature>元素,每个元素都是数字签名。
每个<Signature>元素对文档中的特定元素进行如下签名:
<Person xmlns="http://mynamespace" Id="123456789">
<Signature>元素包含一个<Reference>元素,它指向该Id,如下所示:<Reference URI="#123456789">
<Signature>元素是由私钥签名的。此元素包括由签名机构签署的X.509证书。如果已签名文档的接收方信任此签名机构,则接收方可以验证证书,并使用包含的公钥验证签名。
注意: IRIS还支持一种变体,其中有签名的元素有一个名为ID的属性,而不是ID。
下面是一个示例,为了便于阅读,添加了空格:
除了控制命名空间分配外,还可以控制命名空间分配在XML输出中的显示方式。具体地说,可以控制以下内容:
将元素和属性分配给命名空间时,XML中有两种等效的表示形式,由编写器实例的SuppressXmlns属性控制。
为一个名为Person的对象生成XML输出,该对象被分配给名称空间“http://www.person.org”(通过前面讨论的namespace类参数)。
使用缺省输出(SuppressXmlns等于0)的示例如下:
<Person xmlns="http://www.person.com" GroupID="4">
<Name>Uberoth,Amanda Q.</Name>
<DOB>1952-01-13</DOB>
</Person>
另一种可能的形式完全相同,如下所示。
这是使用SuppressXmlns等于1生成的,它确保显式分配给名称空间的每个元素都显示为该名称空间的前缀。
<s01:Person xmlns:s01="http://www.person.com" GroupID="4">
<s01:Name>Uberoth,Amanda Q.</s01:Name>
<s01:DOB>1952-01-13</s01:DOB>
</s01:Person>
本章介绍如何加密XML文档。
提示:发现在此命名空间中启用SOAP日志记录非常有用,这样就可以收到有关任何错误的更多信息。
加密的XML文档包括以下元素:
<EncryptedData>元素,其中包含由随机生成的对称密钥加密的加密数据。(使用对称密钥加密比使用公钥加密更有效。)<EncryptedKey>元素。每个<EncryptedKey>元素携带用于加密数据的对称密钥的加密副本;它还包含一个带有公钥的X.509证书。拥有匹配私钥的接收方可以解密对称密钥,然后解密<EncryptedData>元素。要创建DOM或修改现有DOM,请使用%XML.Document的以下方法在:
classmethod CreateDocument(localName As %String,
namespace As %String)
as %XML.Document
在仅包含根元素的返回%XML.Document新实例。
method AppendCharacter(text As %String)
将新的字符数据节点追加到此元素节点的子节点列表中。当前节点指针不变;此节点仍然是追加的子节点的父节点。
method AppendChild(type As %String)
将新节点追加到此节点的子节点列表中。当前节点指针不变;此节点仍然是追加的子节点的父节点。
method AppendElement(localName As %String,
namespace As %String,
text As %String)
部分 Ansible 帮助我解决了快速部署 Caché 和应用程序组件以进行数据平台基准测试的问题。 您可以使用相同的工具和方法来建立您的测试实验室、培训系统、开发或其他环境。 如果在客户站点部署应用程序,可以将大量部署自动化,并确保系统、Caché 和应用程序的配置符合您的应用程序最佳做法标准。
注(2019 年 6 月):许多内容发生了变化,最新的详细信息请参见此处 注(2018 年 9 月):自本帖首次发布以来,内容已经有了很大改动,我建议使用 Docker 容器版本,以容器形式运行的项目以及详细信息仍然在 GitHub 的同一个地址发布,您可以下载、运行并根据需要进行修改。
与客户合作进行性能评估、容量规划和故障排除时,我经常解包和查看来自 pButtons 的 Caché 和操作系统指标。 我不久前发布了一个帖子,介绍了一个用来解包 pButtons 指标的实用工具(该实用工具使用 unix shell、perl 和 awk 脚本编写),而不是费力地浏览 html 文件,再将需要绘制的部分剪切并粘贴到 excel 中。 虽然这是一个有用的省时工具,但还不够完善... 我还使用脚本自动绘制指标图表,以便快速查看并包含在报告中。 但是,这些绘图脚本不容易维护,并且当需要站点特定的配置(例如 iostat 或 Windows perfmon 的磁盘列表)时会变得特别混乱,所以我从未公开发布过绘图实用工具。 不过我现在可以很高兴地说,已经有了简单得多的解决方案。
InterSystems 数据平台包括了用于系统监视和警报的实用程序及工具,但对于不熟悉构建于 InterSystems 数据平台(又名 Caché)的解决方案的系统管理员来说,他们需要知道从何处下手以及需要配置什么。
本指南以在线文档和开发者社区帖子为参考,介绍了实现最低限度的监视和警报解决方案的途径,以及如何启用和配置以下组件:
我在用.net通过ODBC连接cache数据库,OdbcConnection connection = new OdbcConnection(dbConnection);connection.Open();打开链接时报这错,请教大佬们,这应该怎么解决吗?不胜感激!
可以使用%XML.Node的以下方法。以检查当前节点的属性。
AttributeDefined() 如果当前元素具有具有给定名称的属性,则返回非零(TRUE)。FirstAttributeName() 返回当前元素的第一个属性的属性名称。GetAttributeValue() 返回给定属性的值。如果元素没有该属性,则该方法返回NULL。GetNumberAttributes() 返回当前元素的属性数。LastAttributeName() 返回当前元素的最后一个属性的属性名称。NextAttributeName() 在给定属性名称的情况下,无论指定的属性是否有效,此方法都会按排序顺序返回下一个属性的名称。PreviousAttributeName() 在给定属性名称的情况下,无论指定的属性是否有效,此方法都会按排序顺序返回上一个属性的名称。下面的示例遍历给定节点中的属性并编写一个简单报表:
%XML.Document和%XML.Node类识别以下DOM节点类型:
$$$xmlELEMENTNODE)请注意,这些宏在%xml.DOM.inc包含文件中定义。
Text ($$$xmlTEXTNODE)
Whitespace ($$$xmlWHITESPACENODE).
其他类型的DOM节点被简单地忽略。
请以下XML文档:
<?xml version="1.0"?>
<team>
<member id="alpha">Jack O'Neill</member>
<member id="beta">Samantha Carter</member>
<member id="gamma">Daniel Jackson</member>
</team>
当作为DOM查看时,该文档由以下节点组成:
文档节点示例
%XML.Document类和%XML.Node类使可以将任意XML文档表示为DOM(文档对象模型)。然后,可以导航此对象并对其进行修改。还可以创建一个新的DOM并将其添加到其中。
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用本书前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
要打开现有XML文档以用作DOM,请执行以下操作:
%XML.Reader的实例。Format属性,以指定要导入的文件的格式。默认情况下, IRIS假定XML文件为文字格式。如果文件是SOAP编码格式,则必须指明这一点,以便可以正确读取该文件。
除非使用Correlate()和Next(),否则此属性无效。
%XML.Reader的以下方法之一。OpenFile() — 打开一个文件。OpenStream() —打开一个流。OpenString() — 打开字符串。OpenURL() — 打开URL。在每种情况下,都可以选择为该方法指定第二个参数,以重写Format属性的值。
/// desc:灵活读取类
ClassMethod Read(mydir, myfile, class, element)
{
set reader=##class(%XML.Reader).%New()
if $extract(mydir,$length(mydir))'="/" {set mydir=mydir_"/"}
set file=mydir_myfile
set status=reader.OpenFile(file)
if $$$ISERR(status) {do $System.Status.DisplayError(status)}
do reader.Correlate(element,class)
while reader.Next(.object,.status)
{
if $$$ISERR(status) {do $System.Status.DisplayError(status)}
set status=object.%Save()
if $$$ISERR(status) {do $System.Status.DisplayError(status)}
}
}