搜索​​​​

清除过滤器
文章
Claire Zheng · 八月 17, 2021

【视频】FHIR标准和国际基于FHIR的互联互通实践

当前医院面临更多互联互通需求,如预约挂号与分级诊疗、检验结果共享、医联体信息化、监管数据上报、临床辅助决策支持等,都需要对多源数据进行集成与整合。医疗机构内部和跨机构数据交换与共享,对互联互通提出新的要求。HL7 FHIR是国际上医疗行业实现数据交换和信息共享的标准之一,正在快速得到医疗行业广泛关注。InterSystems中国技术总监乔鹏在视频中分享了FHIR标准与国际互联互通的一些实践经验。
问题
Michael Lei · 二月 14, 2023

有没有办法导出与Production相关的所有内容?

您好,有没有一种简单的方法可以导出与Production相关的所有内容并在另一个实例中导入? 例如导出Production保存的 db、ns、映射、webapp 相关、资源、角色等 您可以使用InterSystems Package Manager(IPM)列出生产的所有成员,并通过IPM注册表或使用zpmhub将其分发到另一台机器(例如您的客户端)。 例如,您可以将多个EnsDemo产品安装为一个包: 用户>zpm“安装irishealth-ensdemo” 或者最近我发布了一个非常简单的CSV数据转换生产示例,您可以将其安装为一行: USER>zpm "install esh-i14y-csv" 下面是如何在module.xml中描述生产的所有模块。
公告
Michael Lei · 十月 24, 2023

官宣对 CentOS 的支持终止

终止对 CentOS 的支持 自 InterSystems IRIS 2023.3 发布起,CentOS 将不再是受支持的开发平台。 CentOS 一直是一个受支持的开发平台,为开发人员提供了相当于 Red Hat Enterprise Linux (RHEL) 的免费版本,用于 IRIS 开发。您可能知道,Red Hat 对 CentOS 进行了重大更改,CentOS 已成为 RHEL 的“上游”。这意味着它具有 RHEL 中尚未包含的错误和功能,这可能会给在该平台上构建的开发人员带来问题。 我们鼓励使用 CentOS 的开发人员利用 Red Hat 的免费开发人员计划来获得 RHEL 的免费开发许可证。 CentOS 继续支持 IRIS 2023.2(及更早版本)。
文章
Weiwei Gu · 八月 7, 2023

如何自定义 Web 网关错误消息

InterSystems 常见问题解答标题 您可以为以下 Web Gateway 错误消息/系统响应设置单独的错误页面: 服务器错误 服务器繁忙 服务器无法使用 服务器超时 连接关闭 在 Web Gateway 管理界面上进行设置([Management Portal] > [System Administration] > [Configuration] > [Web Gateway Management] > [Configuration] > [Default Parameters])。 在“默认参数”(Default Parameters )菜单的“错误页面”部分中,设置要显示的 html 页面的文件名或发生错误时要重定向到的 URL。 ※Web网关管理界面也可以从以下URL访问。 http://<web server address>:<port>/csp/bin/Systems/Module.cxw 详细信息请参考以下文档自定义错误页面 [IRIS]
文章
Hao Ma · 十一月 20, 2022

ZPM介绍(2)

## 发布您自己的软件 首先:要发布您的软件,您要支持这个”[命名规范](https://community.intersystems.com/post/objectscript-package-manager-naming-convention)。其中和zmp最相关的是包名和l类名的设计,你要定义成这样: **company.project.subpackage.TheClass.cls** 如果您的Package Name定义是: Company.Project, 有大写字母,对不起,是无法用zpm打包的。 [这个链接](https://community.intersystems.com/post/zpm-simple-implementation-cookbook)给了最简单的例子,但还不详细,我来总结一下: 发布您的软件前,有几件事情要了解: 1. zpm的注册中心并不存代码,存的只是一个到您代码的链接。因此,您得找地方放您的代码。当前最常用的是github。 2. 文件目录的结构 举例:有一个class定义是 `com.tony.Test1.cls`, 你的目录应该这么组织,假设您要放在 `/myDemo`, 那么class应该在`/myDemo/src/com/tony/Test1.cls`。这是使用VSCode组织代码的默认方式,**只有保证这样的目录结构,您才可能用zpm加载代码到iris**. 让我来做个简单的例子。 首先,有这样的class: ```java Class com.tony.Test1 { Property p1; } ``` 我的文件目录设置 ```sh $ ls -l /external/myDemo/src total 4 -rw-r--r-- 1 irisowner irisowner 40 Nov 12 10:00 Test1.cls $ ``` 这时候我来使用zpm打包测试 ### module.xml的生成和加载 第一步,生成module.xml 我们看看最简单的用zpm generate命令生成module的例子: ```sh zpm:USER>generate /external/myDemo/project1 Enter module name: project1 Enter module version: 1.0.0 => Enter module description: Enter module keywords: Enter module source folder: src => Existing Web Applications: /csp/user /terminal /terminalsocket Enter a comma separated list of web applications or * for all: Dependencies: Enter module:version or empty string to continue: zpm:USER> ``` `zpm generate`会把/external/myDemo/project1目录下的文件打包,在这个目录下创建一个module.xml文件, 是这样的: ```sh project1 1.0.0 module src ``` 先等等解释这个xml, 让我们先执行第2步。 第2步: 把文件load到iris ```sh zpm:USER>load /external/myDemo/ [USER|firstdemo] Reload START (/external/myDemo/) [USER|firstdemo] Reload SUCCESS [firstdemo] Module object refreshed. [USER|firstdemo] Validate START [USER|firstdemo] Validate SUCCESS [USER|firstdemo] Compile START [USER|firstdemo] Compile SUCCESS [USER|firstdemo] Activate START [USER|firstdemo] Configure START [USER|firstdemo] Configure SUCCESS [USER|firstdemo] Activate SUCCESS zpm:USER> ``` 您去iris里看看, 确认class已经被loaded 第3步: 删除(optional, 但你可能会用到这个命令) ```sh zpm:USER>uninstall firstdemo [USER|firstdemo] Clean START [USER|firstdemo] Unconfigure START [USER|firstdemo] Unconfigure SUCCESS Deleting class com.tony.Test1 [USER|firstdemo] Clean SUCCESS zpm:USER> ``` 这时候您应该可以发现com.tong.Test1类已经从Iris删除了。 对上面的例子总结一下: 1. 打包是对一个文件夹打包 2. 使用zpm把软件包加载进iris是先找包里面的module.xml文件。通过module.xml里定义的信息来知道包的名字,版本,打包的内容等等。 这个module.xml是在打包的时候用`zpm generate`创建的, 但您也可以自己手工创建,比如copy其他包的module.xml改改, 有时候会更快捷,尤其是您对zpm命令不是很熟悉的时候, 对很多打包的需求,比如后面会提到的定义依赖等等,直接改module.xml比`zpm generate`容易多了。 3. 让我来说说可能的问题: module.xml中``定义了包名*com.PKG*, 加载数据包到iris很成功。但是,如果您还记得,刚刚例子里打包的是class是`com.tony.Test1`,那么如果你再定义一个新的类,叫`com.tiedan.Test1`, 用`zpm generate`一个新module, 名字叫project2(注意第一个打包的module名字是project1), project2的"Resource Name"也还是"com.PKG, 它能正确加载吗? 不会, 你会被告知:"ERROR! Resource 'com.PKG' is already defined as part of module 'project1'; cannot also be listed in module 'project2'" ​ 解决方法:手工将module.xml里面的Resource Name改成“com.tony.PKG"和"com.tiedan.PKG", 这样两个包都能成功加载了。 还有个小问题,Mac用户可能会看到这样的提示: >zpm:USER>load /external/myDemo/project1 > >[USER|project1] Reload START (/external/myDemo/project1/) >[project1] Reload FAILURE >ERROR! Unable to import file '/external/myDemo/project1/src/com/.DS_Store' as this is not a supported type. >zpm:USER> 这是说打包的文件夹下面有.DS_Store文件,而zpm不认识。zpm会把里面认识的文件, 比如.cls文件成功加载, 然后告诉你"Roload FAILURE" 好吧, 到这里我们知道怎么打包和把包加载到iris里, 接着看看什么文件可以被打包。 ### Package可以包含的文件类型 这时候要好好了解module.xml的内容的细节了, 请阅读[技术文档的module.xml部分](https://github.com/intersystems/ipm/wiki/03.-Module.xml#elements)。 其中的resource部分,阐明了您可以打包的内容: 第一部分:可以被加载到iris的文件类型。 > Use the following suffixes for different types of resources: > > .PKG - Package > .CLS - Class > .INC - Include > .MAC - Routine > .LOC - LocalizedErrorMessages > .GBL - Global > .DFI - DeepSee Item 第二部分:jar包 ```xml Copies content of lib folder to Target Copies just desired file to Target ``` 第三部分:UnitTest module.xml的例子里给出的UnitTest部分是这个样子 ```xml ``` 说实话,我还没研究怎么使用`zpm generate`可以做到这一点,能想到的就是手工去修改module.xml文件。 第四部分:Web Application 执行`zpm generate`的时候, 会列出当前命名空间可以使用的Web Application列表。让我重新执行一下打包的第一步,看看结果是什么样子 ```sh zpm:USER>generate /external/myDemo/project1 Enter module name: project11 Enter module version: 1.0.0 => Enter module description: Enter module keywords: Enter module source folder: src => Existing Web Applications: /csp/user /terminal /terminalsocket Enter a comma separated list of web applications or * for all: /csp/user Enter path to csp files for /csp/user: Dependencies: Enter module:version or empty string to continue: zpm:USER> ``` 得出的module.xml里多了如下内容: ```xml src ``` 其中,打包时提问`Enter path to csp files for /csp/user:。 这里,您需要填入的是当前要load的csp文件。比如:您有一个tony.csp要加载,那么您可以在要打包的目录下创建一个子目录“cspfiles", 把tony.csp放在cspfiles目录里, 回答提问的使用这样 `Enter path to csp files for /csp/user:/cspfiles` > 这里用的是相对路径,但格式是绝对路径的格式,我把它看成一个bug。 module.xml中还有其他很多配置的内容,我在后面会介绍包的依赖的部分。 ### 软件包的Package 用package命令,在iris里将软件打包。打包的结果是得倒一个project1-1.0.0.tgz的文件。 `package -v`显示verbose信息,您可以清楚的看到project1-1.0.0.tgz和module.xml的存放位置。 ```sh zpm:USER>project1 package -v [USER|project1] Reload START (/external/myDemo/project1/) Skipping preload - directory does not exist. Load of directory started on 11/20/2022 13:15:17 '*' Loading file /external/myDemo/project1/src/com/tony/Test1.cls as udl Load finished successfully. [USER|project1] Reload SUCCESS [project1] Module object refreshed. [USER|project1] Validate START [USER|project1] Validate SUCCESS [USER|project1] Compile START Compilation started on 11/20/2022 13:15:17 with qualifiers 'd-lck' Compiling class com.tony.Test1 Compiling routine com.tony.Test1.1 Compilation finished successfully in 0.008s. [USER|project1] Compile SUCCESS [USER|project1] Activate START [USER|project1] Configure START [USER|project1] Configure SUCCESS Studio project created/updated: project1.PRJ [USER|project1] Activate SUCCESS [USER|project1] Package START Exporting 'com.tony.Test1.cls' to '/usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/src/com/tony/Test1.cls' Exported to /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/module.xml Module exported to: /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/ Module package generated: /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0.tgz [USER|project1] Package SUCCESS zpm:USER> ``` ### 软件包的Publish 我们并没有权限把软件包直接发布到官方的registry去。您需要去InterSystems的[OpenExchange页面](https://openexchange.intersystems.com),提交您的软件包。如下图填入软件包的信息,Github URL, 注意勾选右下角的"Publish in Package Manager" 。 ![image](/sites/default/files/inline/images/image-20221120215709459.png) 后面, 我会介绍怎么创建自己team的私服, 用zpm publish可以简单的把iris的软件包发布到私服上去,这对一个开发团队共享软件包并方便部署应该是更有吸引力些。 马老师,zpm可以打包出任务计划里的指定任务吗? 正常导出用sql, 执行`call %sys.task_tasklist()`。内部并没有一个表,而是直接存成global形式,而且结构还挺复杂真找还是能找到,那么你可以把这个global打包到zpm。 个人以为这是个错误的方法。导入导出global就不是正常该干的事,尤其是对于%SYS库。 如果我做, 我会写个定义task的程序,打在安装包里,到处都能用。
文章
Jeff Liu · 六月 30, 2024

孤儿消息数据新手指南--如何清理 200 多 GB 的数据

Purpose of this article 有两篇很棒的有关删除消息关联的孤儿记录的内容以及如何处理孤儿的问题的WRC议最佳实践文章Ensemble Orphaned Messages | InterSystems Developer Community | Best DeleteHelper - A Class to Help with Deleting Referenced Persistent Classes (intersystems.com)本文并不是要取代 Intersystems 专业人员撰写的这些文章,而是要在此基础上介绍我们如何利用这些信息和其他讨论(包括我们实际清理这些数据的方法)来帮助我们的数据库变得更加紧凑。 情况说明: 我们的备份越来越多。年初的时候,我们遇到过一台服务器被强制故障的情况,需要进行还原。由于数据库庞大,即使复制这个数据库也需要很长时间,更不用说还原重建shadow服务器了。因此,我们不得不决定最终解决这一增长问题。最初的原因已经确定 开箱即用的任务或者在某些时候假定已运行,但没有勾选信息体。这是因为在查询其中一个消息体时,我们得到了来自 10 多年前的 ID 1。该任务是最佳实践中提到的默认 Ens.Util.Tasks.Purge。这就引出了流程中的提示 1 理解你的数据 您在数据库中存储了哪些数据?您是否有必须保存在记录表中的数据?对于您的事务数据,我指的是与message header相关联的报文,您可以使用以下方法进行查询 SELECT Distinct(MessageBodyClassName) from Ens.MessageHeader 最初,我会查看报文类,打开这些报文类,了解这些报文存储在哪个global中 这样,您就能在一定程度上了解数据的存储位置。 注意,如果您直接保存到数据流(如 %LIBRARY.GLOBALBINARYSTREAM)中,则表明存在孤儿,因为这些孤儿应保存到数据流容器中,我们稍后将介绍这一点 Running Global size report运行 GSize 是一目了然查看数据库大小的工具之一,它可以显示数据在数据库中的存储位置。在终端运行以下步骤 do ^%GSIZE Directory name: NAMESAPCE/ => All Globals? No => YES Show details => NO 这可以说明数据在哪里被用掉,从而为您提供指导。 步骤 2 阻止未来的孤儿 最佳实践指南中对此进行了很好的阐述,但我们还是对其中的步骤进行了细分。 查找直接发送缓存流的类,并将代码迁移到使用流容器的类。 查找未处理的嵌入类--添加手动删除和删除辅助工具 查看 hl7 消息的几个 %OnSaves 步骤 3 清理孤儿数据 每天运行清理任务 清理持久化流和其他杂项孤儿数据 使用直接流类的班级 Suriya Narayanan 指出,不应直接使用任何 %libary 类。如果不包含数据流,数据流最终会进入 ^Ens.Stream。这些数据不会以良好的引用方式存储,因此您必须在全局中查找您想要保留的最后数据。 在我们的场景中,是 BP 向操作发送消息,而不是将流添加到容器中。 set HTMLDocument=##class(%Library.GlobalBinaryStream).%New() set tSC=..SendRequestSync(..DocmanRouterName,HTMLDocument, .aResponse,20,"") //needed sent instead as container set requestContainer = ##class(Ens.StreamContainer).%New() set tSc=requestContainer.StreamSet(HTMLDocument) set tSC=..SendRequestSync(..DocmanRouterName,requestContainer, .aResponse,20,"") %Saves 并非所有在发送前 %save 的类都会导致问题,只有在没有发送的情况下才会。这种情况可能发生在修改经常保存的 hl7 副本时,也可能发生在临时保存但没有发送的情况下。下面是一个对 hl7 进行操作后没有保存的数据流示例,因此创建了 orpahans。有时,在清除了孤儿和监视器后,我就不会再创建孤儿了,下面的 %save 对象从未被使用过,因此是一个 orpahan,因为只发送了 hl7。在此之前有一个 %new 对象 嵌入式对象 下面的删除辅助文档就是一个例子。XML 信息在这方面是出了名的 Class Messages.XML.GenericWif.fileParameters Extends (%Persistent, %XML.Adaptor) { Property revisionNumber As %String; Property primaryLink As Messages.XML.GenericWif.primaryLink; Property additionalIndexes As Messages.XML.GenericWif.additionalIndexes; 在填充对象后,只有 Messages.XML.GenericWif.fileParameters 会被删除。 1) 进入每个对象,添加类方法和 OnDelete SQL 触发器,检查是否存在子对象并将其删除。可以使用 objectscript 或 sql 进行检查 ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private ] { // Delete the property object references. Set tSC = $$$OK, tThis = ##class(Messages.XML.GenericWif.fileParameters).%Open(oid) If $ISOBJECT(tThis.primaryLink) Set tSC = ##class(Messages.XML.GenericWif.primaryLink).%DeleteId(tThis.primaryLink.%Id()) If $ISOBJECT(tThis.additionalIndexes) Set tSC = ##class(Messages.XML.GenericWif.additionalIndexes).%DeleteId(tThis.additionalIndexes.%Id()) Quit tSC } /// Callback/Trigger for SQL delete Trigger OnDelete [ Event = DELETE ] { // Delete the property object references. {%%ID} holds the id of the record being deleted. Set tID={%%ID} Set tThis = ##class(Messages.XML.GenericWif.fileParameters).%OpenId(tID) If $ISOBJECT(tThis.primaryLink) Do ##class(Messages.XML.GenericWif.primaryLink).%DeleteId(tThis.primaryLink.%Id()) If $ISOBJECT(tThis.additionalIndexes) Do ##class(Messages.XML.GenericWif.additionalIndexes).%DeleteId(tThis.additionalIndexes.%Id()) Quit } 对于 objectscript,您可以打开其中一个 id,我们在测试系统或非生产系统上复制了该 id,例如,键入查询一条最旧的记录,然后在 sql 中查询其他表,例如 Messages_XML_GenericWif.primaryLink。然后,您可以查看是否可以打开其中的子 id。例如,您添加了代码,删除了包含嵌入式消息的 fileParameters 的 id 1。 set a = ##class(Messages.XML.GenericWif.primaryLink).%OpenId(2) zw a //this output the info. Now delete parent set tSC=##class(Messages.XML.GenericWif.fileParameters).%DeleteId(1) set a = ##class(Messages.XML.GenericWif.primaryLink).%OpenId(2) zw a //a should be "" 选项 2 是 deleteHelper。它的作用是在代码的 .int 中添加 %onDelete 类方法,而不是 sql。您只需在消息类的扩展中添加 deleteSuper 类,即 Class Messages.BoltonRenal.Pathology.Outbound.PathologyResult Extends (Ens.Request, SRFT.Utility.DeleteHelper.OnDeleteSuper) { Property requestingClinician As %String; Property department As Messages.BoltonRenal.Pathology.Outbound.Department; // the on deletesuper is a class like this in the link include Ensemble /// A class to help assist in "deep" deleting of an instance, including references to other persistent classes. /// <br><br> /// To use simply add as a Super Class in your persistent class<br> /// The class defines a Generator %OnDelete method that will generate code for your class, /// deleting, if needed, references (inclduing collections) to other persistent classes<br> ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ CodeMode = objectgenerator, Private, ServerOnly = 1 ] { // a list ($ListBuild format) of "simple" (non-collection) property names we'll want to delete the references of (because they're Persistent) Set delPropNames = "" 如果您转到routine、消息和 .int,就会发现嵌入的对象开始被删除,例如: 清理消息 在这一切之后,我们编写了自己的类来清除 150 天之外的信息。我们的想法如下 在数据查找表中设置要删除的自定义邮件类型(升级版可以将其存储在表格中,使代码更简洁 手动设置删除最旧的 ens email正文。 创建全局数据以存储结果。 手动清理stream和其他残留物 再次提醒,请自行承担删除风险 我们的想法是,你有自己的报文正文类型列表(你的基础可能是 HL7 和报文正文详细信息)。 代码会在其中循环,并从报文头中获取最小 ID(对于报文正文,您需要查看保存到 messagebody 的最旧自定义报文),然后通过以下方式删除 if msgBodyName="Ens.MessageBody"{ set tMinMsgId=..MinBodyID }else { set tMinMsgId=..GetMinimumIDForMessage(rs.MessageBodyClassName) } // Min ID is just basically this query set minIDQuery="SELECT TOP(1) MessageBodyID FROM Ens.MessageHeader where MessageBodyClassName=?" And deletes it. Has added code around it to log SET tSC1=$CLASSMETHOD(className,"%DeleteId",tResult.ID) 您可以尝试删除每种类型的数量。在运行 hl7 和报文体时,我们删除了 500000 个,而在运行报文体时,我们删除了 7200000 个。 同样,先在实时数据库的复刻环境(非生产或开发系统)上进行测试 您不希望删除过多内容导致journal过大,因此需要反复试验。 如使用后丢失所需数据,我不承担任何责任。 清理流数据 我们有一个小任务,可以用来直接杀死global stream。更新数字并运行 .NET Framework 3.0。要非常清楚你应该保留的最新数据流编号是多少,而且只有当你剩下的数据流是连续的时才有效 ClassMethod StreamPurge() As %Status { set i=1 while (i<200000){ k ^CacheStream(i) s i=i+1 } q $$$OK }
文章
姚 鑫 · 三月 11, 2021

第八章 SQL修改数据库

# 第八章 SQL修改数据库 可以对现有的表使用SQL语句,也可以对相应的持久化类使用ObjectScript操作来修改InterSystems IRIS®数据平台数据库的内容。 不能修改定义为只读的持久类(表)。 使用SQL命令为维护数据的完整性提供了自动支持。 SQL命令是一个原子操作(全部或没有)。 如果表上定义了索引,SQL将自动更新它们以反映更改。 如果定义了任何数据或引用完整性约束,SQL将自动执行它们。 如果有任何已定义的触发器,执行这些操作将拉动相应的触发器。 # 插入数据 可以使用SQL语句或设置和保存持久化类属性将数据插入表中。 ## 使用SQL插入数据 `INSERT`语句将一条新记录插入SQL表中。 可以插入一条记录或多条记录。 下面的示例插入一条记录。 它是插入单个记录的几种可用语法形式之一: ```sql INSERT INTO MyApp.Person (Name,HairColor) VALUES ('Fred Rogers','Black') ``` 以下示例通过查询现有表中的数据插入多条记录: ```sql INSERT INTO MyApp.Person (Name,HairColor) SELECT Name,Haircolor FROM Sample.Person WHERE Haircolor IS NOT NULL ``` 还可以发出`INSERT`或`UPDATE`语句。 如果SQL表中不存在新记录,则该语句将该记录插入该SQL表中。 如果记录存在,则该语句使用提供的字段值更新记录数据。 ## 使用对象属性插入数据 可以使用ObjectScript插入一条或多条数据记录。 创建一个现有持久化类的实例,设置一个或多个属性值,然后使用`%Save()`插入数据记录: 下面的例子插入一条记录: ```java SET oref=##class(MyApp.Person).%New() SET oref.Name="Fred Rogers" SET oref.HairColor="Black" DO oref.%Save() ``` 下面的例子插入多条记录: ```java SET nom=$LISTBUILD("Fred Rogers","Fred Astare","Fred Flintstone") SET hair=$LISTBUILD("Black","Light Brown","Dark Brown") FOR i=1:1:$LISTLENGTH(nom) { SET oref=##class(MyApp.Person).%New() SET oref.Name=$LIST(nom,i) SET oref.HairColor=$LIST(hair,i) SET status = oref.%Save() } ``` # UPDATE语句 `UPDATE`语句修改SQL表中的一条或多条现有记录中的值: ```java UPDATE语句修改SQL表中的一条或多条现有记录中的值: ``` # 在插入或更新时计算字段值 在定义计算字段时,可以指定ObjectScript代码来计算该字段的数据值。 可以在插入、更新行、插入和更新行或查询行时计算此数据值。 下表显示了每种计算操作类型所需的关键字以及字段/属性定义示例: - 只在插入时计算 - SQL DDL `COMPUTECODE`关键字`Birthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP}` - 持久化类定义`SqlComputeCode`和`SqlComputeCode`关键字属性生日为`%String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed];` - 只在更新时计算 - SQL DDL DEFAULT, `COMPUTECODE`,和`COMPUTEONCHANGE`关键字`Birthday VARCHAR(50) DEFAULT ' ' COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP} COMPUTEONCHANGE (DOB)` - 在插入和更新上都进行计算 - SQL DDL `COMPUTECODE`和`COMPUTEONCHANGE`关键字`Birthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP} COMPUTEONCHANGE (DOB)` - 持久化类定义`SqlComputeCode`, `SqlComputed, and SqlComputeOnChange`属性关键字属性`Birthday As %String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed, SqlComputeOnChange = DOB];` - 计算对查询 - SQL DDL `COMPUTECODE`和计算或瞬态关键字B`irthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP}`计算 - 持久类定义`SqlComputeCode`, `SqlComputed, and calculate`或瞬态属性关键字属性`Birthday`为%`String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed, calculate]`; DDL `DEFAULT`关键字在插入时优先于计算数据值。 `DEFAULT`必须接受一个数据值,例如空字符串; 不能为空。 在持久类定义中,InitialExpression属性关键字在插入时不会覆盖`SqlComputed`数据值。 DDL `COMPUTEONCHANGE`关键字可以使用单个字段名,也可以使用逗号分隔的字段名列表。 这些字段名指定了哪些字段更新时会触发对该字段的计算; 列出的字段名称必须存在于表中,但它们不必出现在计算代码中。 必须指定实际的字段名; 不能指定星号语法。 在修改记录时,可以使用`ON UPDATE`关键字短语将字段设置为文字或系统变量(如当前时间戳),而不是使用`COMPUTECODE`和`COMPUTEONCHANGE`。 `ON UPDATE`短语同时修饰`INSERT`和`UPDATE`; 若要只在更新时修改,请使用默认短语和更新短语。 每次查询访问该字段时,DDL计算或`TRANSIENT`关键字都会计算一个数据值。 该字段不需要在选择列表中指定。 例如,`SELECT Name FROM MyTable WHERE LENGTH(Birthday)=36`在计算条件表达式之前计算生日字段。 管理门户Open Table选项执行一个查询,因此计算计算的和临时的数据值。 计算字段限制: - 不更新的更新:为记录中的字段提供与它们之前的值相同的值的更新实际上并不更新记录。 如果没有对记录执行真正的更新,则不会调用`COMPUTEONCHANGE`。 即使没有对一条记录执行真正的更新,也会在更新操作上调用`ON UPDATE`。 如果希望在更新时总是重新计算已计算字段,而不管记录是否实际更新,请使用更新触发器。 - 用户为计算字段指定的显式值: - `INSERT`:在`INSERT`时,您总是可以向`COMPUTECODE`、`DEFAULT`或`On UPDATE`字段提供显式的值。 InterSystems SQL总是采用显式的值,而不是生成的值。 - 更新`COMPUTEONCHANGE`:更新操作可以为`COMPUTEONCHANGE`字段提供显式的值。 InterSystems SQL总是采用显式的值,而不是计算的值。 - 更新时更新:更新操作不能为`ON UPDATE`字段提供显式值。 InterSystems SQL忽略用户提供的值,并接受`ON UPDATE`生成的值。 但是,InterSystems SQL确实会对显式值执行字段验证,例如,如果提供的值大于最大数据大小,就会生成`SQLCODE -104`错误。 - 计算或暂态:插入或更新操作不能为计算或暂态字段提供显式值,因为计算或暂态字段不存储数据。 但是,InterSystems SQL确实会对显式值执行字段验证,例如,如果提供的值大于最大数据大小,就会生成`SQLCODE -104`错误。 # 删除语句 `DELETE`语句从SQL表中删除一条或多条现有记录: ```sql DELETE FROM MyApp.Person WHERE HairColor = 'Aqua' ``` 可以执行`TRUNCATE TABLE`命令删除表中的所有记录。 还可以使用`delete`删除表中的所有记录。 `DELETE`(默认情况下)提取删除触发器; `TRUNCATE TABLE`不拉出删除触发器。 使用`DELETE`删除所有记录不会重置表计数器; `TRUNCATE TABLE`重置这些计数器。 # 事务处理 事务是一系列插入、更新、删除、插入或更新以及截断表数据修改语句,它们组成单个工作单元。 `SET TRANSACTION`命令用于设置当前进程的事务参数。 还可以使用`START TRANSACTION`命令设置相同的参数。 这些事务参数在多个事务中继续有效,直到显式更改为止。 `START TRANSACTION`命令显式地启动事务。 这个命令通常是可选的; 如果事务`%COMMITMODE`是隐式或显式的,事务从第一个数据库修改操作自动开始。 如果事务`%COMMITMODE`为`NONE`,则必须显式指定`START transaction`来启动事务处理。 如果事务成功,提交其更改可以是隐式(自动)或显式的; `%COMMITMODE`值决定是否需要显式地使用`COMMIT`语句来永久地将数据修改添加到数据库并释放资源。 如果事务失败,可以使用`ROLLBACK`语句撤消其数据修改,这样这些数据就不会进入数据库。 注意:通过管理门户执行SQL查询接口运行SQL时,不支持SQL事务语句。 这个接口旨在作为开发SQL代码的测试环境,而不是用于修改实际数据。 ## 事务和保存点 在InterSystems SQL中,可以执行两种事务处理:完整事务处理和使用保存点的事务处理。通过完整的事务处理,事务将从`START TRANSACTION`语句(显式或隐式)开始,一直持续到`COMMIT`语句(显式或隐式)结束事务并提交所有工作,或者`ROLLBACK`语句反转事务期间完成的所有工作。 通过保存点,InterSystems SQL支持事务中的级别。可以使用`START TRANSACTION`语句(显式或隐式)开始事务。然后,在事务期间,可以使用`SAVEPOINT`在程序中指定一个或多个命名保存点。可以在一个事务中最多指定255个命名保存点。添加一个保存点会增加`$TLEVEL`事务级别计数器。 - `COMMIT`提交事务期间执行的所有工作。保存点将被忽略。 - `ROLLBACK`将回滚事务期间执行的所有工作。保存点将被忽略。 - `ROLLBACK TO SAVEPOINT`点名将回滚自点名指定的`SAVEPOINT`以来执行的所有工作,并以适当数量的保存点级别将内部事务级别计数器递减。例如,如果建立了两个保存点`svpt1`和`svpt2`,然后回滚到`svpt1`,则`ROLLBACK TO SAVEPOINT` `svpt1`会反转自`svpt1`以来所做的工作,在这种情况下,将事务级别计数器减2。 ## 非事务操作 当事务生效时,以下操作不包括在事务中,因此无法回滚: - `IDKey`计数器增量不是事务操作。`IDKey`由`$INCREMENT`(或`$SEQUENCE`)自动生成,它维护独立于SQL事务的计数。例如,如果插入`IDKey`为17、18和19的记录,然后回滚此插入,则下一条要插入的记录的`IDKey`将为20。 - 缓存查询的创建、修改和清除不是事务操作。因此,如果在事务期间清除高速缓存的查询,然后回滚该事务,则在回滚操作之后,高速缓存的查询将保持清除状态(不会恢复)。 - 事务内发生的DDL操作或调谐表操作可以创建和运行临时例程。此临时例程被视为与缓存查询相同。也就是说,临时例程的创建、编译和删除不被视为事务的一部分。临时例程的执行被认为是事务的一部分。 ## 事务锁 **事务使用锁来保护唯一的数据值。例如,如果进程删除了唯一的数据值,则该值在事务持续时间内被锁定。因此,在第一个事务完成之前,另一个进程无法使用相同的唯一数据值插入记录。这可以防止回滚导致具有唯一性约束的字段出现重复值。这些锁由`INSERT`、`UPDATE`、`INSERT`或`UPDATE`和`DELETE`语句自动应用,除非该语句包含`%NOLOCK`限制参数。** ## 事务大小限制 除了日记文件的空间可用性外,可以在事务中指定的操作数量没有限制。锁表的大小通常不会施加限制,因为InterSystems IRIS提供自动锁升级。 每个表有1000个锁的默认锁阈值。对于当前事务,一个表可以有1000个唯一的数据值锁。第100个锁定操作在事务持续时间内将该表的锁定升级为表锁。 此锁定阈值可使用以下任一选项进行配置: - 调用`$SYSTEM.SQL.SetLockThreshold()`方法。此方法更改当前系统范围的值和配置文件设置。要确定当前的锁升级阈值,请使用`$SYSTEM.SQL.GetLockThreshold()`方法。 - 转到管理门户。从系统管理中,依次选择配置、SQL和对象设置、SQL。在此屏幕上,可以查看和编辑锁定阈值的当前设置。 可以终止的子节点(子表)的数量没有限制。所有子节点终止都被记录下来,因此可以回滚。 ## 读取未提交的数据 可以通过为发出查询的进程设置`SET TRANSACTION`或`START TRANSACTION`来指定读取隔离级别。 - 提交未提交的隔离级别:对于其他用户进行查询(只读)访问,可以看到未提交的对数据的插入,更新和删除。如果未指定任何事务,则为默认设置。 - 已验证隔离级别:可供其他用户以查询(只读)访问的方式看到未提交的对数据的插入,更新和删除。提供对查询条件所使用并由查询显示的数据的重新检查。 - 读取已提交的隔离级别:未提交的插入和更新对数据所做的更改未显示在查询结果集中。查询结果集仅包含已提交的插入和更新。但是,未提交的删除对数据所做的更改将显示在查询结果集中。 不管当前的隔离级别如何,以下`SELECT`命令子句始终返回未提交的数据:聚合函数,`DISTINCT`子句,`GROUP BY`子句或带有`%NOLOCK`关键字的`SELECT`。 ## ObjectScript事务命令 ObjectScript和SQL事务命令是完全兼容和可互换的,但以下情况除外: **如果没有当前事务,则`ObjectScript TSTART`和`SQL START TRANSACTION`都将启动一个事务。但是,`START TRANSACTION`不支持嵌套事务。因此,如果需要(或可能需要)嵌套事务,则最好使用`TSTART`启动事务。如果需要与SQL标准兼容,请使用`START TRANSACTION`。** ObjectScript事务处理为嵌套事务提供了有限的支持。 SQL事务处理为事务中的保存点提供支持。
文章
Hao Ma · 十一月 26, 2022

ZPM介绍(3)

## 建立私服(Porxy-Registry) 这张图解释了您的私服是怎么工作的, 整篇文章在这里: [Proxy-Registry](https://community.intersystems.com/post/new-zpm-registry-feature-%E2%80%93-proxy-registry) ![](https://community.intersystems.com/sites/default/files/inline/images/proxy.png) ### 搭建私服 您需要有一台自己的的服务器, 在上面安装IRIS, zpm, 然后用zpm去下载另一个软件包“zpm-registry"。象这样 ```sh zpm:DEMO>search -r zpm-registry registry https://pm.community.intersystems.com: zpm-registry 1.1.11Repository: https://github.com/intersystems-community/zpm-registry/ zpm:DEMO>install zpm-registry [DEMO|zpm-registry] Reload START (/usr/irissys/mgr/.modules/DEMO/zpm-registry/1.1.11/) [DEMO|zpm-registry] Reload SUCCESS [zpm-registry] Module object refreshed. [DEMO|zpm-registry] Validate START [DEMO|zpm-registry] Validate SUCCESS [DEMO|zpm-registry] Compile START [DEMO|zpm-registry] Compile SUCCESS [DEMO|zpm-registry] Activate START [DEMO|zpm-registry] Configure START [DEMO|zpm-registry] Configure SUCCESS [DEMO|zpm-registry] Activate SUCCESS zpm:DEMO> ``` 到github页面, https://github.com/intersystems-community/zpm-registry/, 你可以得到更详细的软件信息。 配置私服连接公服, 需要在私服的IRIS的安装目录添加一个yaml文件, 定义uplink: ```yaml uplinks: pm: url: https://pm.community.intersystems.com/ allow_packages: dsw,zpm*,?u* ``` 几点说明: - uplinks的项目可以有多个,pm是intersystems的默认公共registry - allow_packages: - a comma-separated list of allowed packages, you can use the exact package name or mask: * - any sequence of characters, ? - any charac - registry 提供的rest 接口描述: https://pm.community.intersystems.com/_spec ### 设置zpm client连接私服 通过repo命令将您的zpm client切换到刚刚配置的私服。`repo -n registry`里面的 - user, - pass是你搭建的私服的账号密码。您也可以在私服上修改/registryWeb应用不做用户验证。 ```sh zpm:DEMO>repo -list registry Source: https://pm.community.intersystems.com Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No zpm:DEMO>repo -n registry -r -url http://localhost:52773/registry/ -user superuser -pass demo registry Source: http://localhost:52773/registry/ Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No Username: superuser Password: zpm:DEMO> ``` 这时的私服时没有连接公服。 ### 发布软件包到私服 **发布一个 GitHub 的包** 先把软件存在github, 然后用curl命令把包发布在私服的地址。 ```sh $ curl -i -X POST -H "Content-Type:application/json" -u superuser:1104 -d '{"repository":"https://github.com/psteiwer/ObjectScript-Math"}' 'http://localhost:52773/registry/package’ ``` **使用zpm 客户端先在本地load,然后使用publish 命令** 大概像这个样子: ```sh zpm:USER>help load ... ■ Examples ∙ load C:\module\root\path\ load C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml ∙ load -dev -verbose C:\module\root\path\ load -dev -verbose C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. ∙ load https://github.com/user/repository.git load https://github.com/user/repository.git -b branch-name Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. zpm:USER> load https://github.com/user/repository.git zpm: USER> publish ``` ## 其他的Feature 在使用中您还会有各种各样的需求, 但我相信看到现在您应该对怎么寻找答案非常清楚了。这里简单的说两个feautre ### 1. 发布为Delopyed模式 如果您要隐藏自己的代码,只发布编译后的软件, 可以简单的修改Module.xml, 设置““, zpm会自动完成。 ### 2. 包的依赖 因为有朋友问,所以说一些包依赖的功能。是的, zpm是设计了包依赖的功能的,在module.xml里添加Dependencies节点, 可以定被依赖的包的列表。 具体的写法请参见这个例子:[module.xml example](https://github.com/intersystems/ipm/wiki/03.-Module.xml#modulexml-example)。 虽然但是,对ObjectScript程序来说,定义包依赖的机会并不多。我能想到的应用场景就是, 当您的软件中想用社区其他包,比如上面的bitmap-adoption的包的话,您可以包"bitmap-adoption"打包到module.xml里面。 我对当前发布的200多软件包随便挑了一些,还没有发现有哪个使用了包依赖, 象这样: ```sh zpm:USER>list-dependents yaml-utils zpm:USER>list-dependents terminal-multiline-editor zpm:USER>list-dependents bitmap-adoption zpm:USER>list-dependents global-dump-sql ... ```
文章
姚 鑫 · 五月 19, 2021

IRIS 单元测试

# IRIS 单元测试 # [第一章 单元测试概述☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/116884316) # [第二章 使用%UnitTest进行单元测试☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/116906659) # [第三章 执行测试☆☆☆](https://yaoxin.blog.csdn.net/article/details/116974672) # [第四章 使用Setup和tear Down方法执行测试☆☆☆](https://yaoxin.blog.csdn.net/article/details/117014533) # 前言 IRIS提供了用于对应用程序进行单元测试的类的%UnitTest包。该包为快速开发单元测试类、执行测试和创建报告提供了便利。可以直接使用该包,也可以扩展其类来自定义单元测试工具。%UnitTest在结构上与用于单元测试的xUnit框架非常相似。熟悉这些框架的开发人员使用%UnitTest会特别容易。 本教程提供对%UnitTest包的快速实践介绍。本教程的第一部分和第二部分是相互独立的,可以按任何顺序完成。 - 完成本教程的第一部分,了解单元测试和集成测试之间的区别、xUnit框架和%UnitTest之间的结构相似性,以及单元测试在敏捷应用程序开发方法中的作用。 - 完成本教程的第二部分,学习如何使用%UnitTest中的类为InterSystems IRIS应用程序创建和执行单元测试。 注意:本教程假定基本熟悉ObjectScript和InterSystems IRIS的面向对象开发。 # 预告 下一期系列将用一个月的时间连载,**《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)
文章
Shanshan Yu · 七月 5, 2023

基于IntegratedML及Dashboard的数据分析应用

基于InterSystems的集成ML技术和Dashboard,根据上传的CSV文件自动生成相关预测和BI页面。前端和后端在Vue和Iris中完成,使用户可以通过简单的操作生成所需的数据预测和分析页面,并根据这些页面做出决策。 # ZPM 安装 zpm:USER>install IntegratedMLandDashboardSample # 部署流程 使用或创建新的命名空间 将代码导入相应的命名空间 在终端中执行: Do # # class (customizemashinelerningandaanalysis. Util. Tool) Deployment() 前端是Vue文件夹下的dist文件夹。在使用它之前,请打开dist-static config.js并修改后端服务器要使用的IP和端口。然后您需要将iframeUrl的测试修改为“Analysis”+后端使用的命名空间,例如“AnalysisUSER” 然后启动前端文件(可以将dist文件夹放在tomcat中开始使用) 访问地址为: Ip: port/dist # 如何使用 以women.csv为例 1.选择要上传的CSV文件,CSV文件名和数据列名不得包含空格等其他符号 2.填写需要预测的列名,如“高度” 3.单击“确定”按钮,等待界面返回 成功返回后,刷新当前页面,然后单击“模型列表”下的辅助选项。新生成的项目将出现 ① 填写完其他值后,点击②确定,在③处生成预测值 ④ 嵌入式虹膜仪表板显示以前导入CSV的一些数据 # 其他 CSV 展示 # 单元测试 Set ^UnitTestRoot=your modules dir +"\src"+namespace+"\integratedmlanddashboardsample\src" (such C:\InterSystems\HealthConnect\mgr\.modules\USER\integratedmlanddashboardsample\src) do ##class(%UnitTest.Manager).RunTest("UnitTests") #注意 由于页面上嵌入了iris的仪表板,如果您遇到无法正确显示的跨域问题,可以访问iris查看图表 非常棒的应用!那csv中的数据能不能是非数字呢?
文章
Jingwei Wang · 六月 20, 2022

IRIS/HealthConnect 高可用机制 Mirror 的配置

安装Arbiter 为了将自动故障转移扩展到尽可能广泛的故障情况,InterSystems建议你为每个镜像配置一个仲裁机。 要充当仲裁者,系统必须有一个正在运行的ISCAgent进程。由于ISCAgent是与InterSystems IRIS一起安装的,任何承载一个或多个InterSystems IRIS实例的系统都符合这一要求,可以被配置为仲裁者而无需进一步准备;但是,承载一个或多个故障转移或DR异步镜像成员的系统不应该被配置为该镜像的仲裁者。 没有托管InterSystems IRIS实例的系统可以通过安装Arbiter方式的作为仲裁者。请从InterSystems公司下载适合你的仲裁者系统平台的ISCAgent安装包,然后,安装ISCAgent。 注意:Arbiter的版本要和InterSystems IRIS安装版本保持一致。 在Windows上安装Arbiter 在Windows系统上,只需执行安装文件,例如ISCAgent-2020.1.0.540.0-win_x64.exe。 在Linux上安装Arbiter [root@arbiterhost home]# gunzip ISCAgent-2020.1.0.540.0-lnxrhx64.tar.gz [root@arbiterhost home]# tar -xf ISCAgent-2020.1.0.540.0-lnxrhx64.tar [root@arbiterhost home]# ./ISCAgent/agentinstall 启动、停止、检查ISCAgent状态 systemctl start ISCAgent.service systemctl stop ISCAgent.service systemctl status ISCAgent.service 设置、终止开机自动启动ISCAgent sudo systemctl enable ISCAgent.service sudo systemctl disable ISCAgent.service 启动 ISCAgent 服务 在所有的服务器中(主机,备机,仲裁机),ISCAgent必须被配置为在系统启动时自动启动。 a. 进入管理工具——服务,选择ISCAgent,将启动类型改为自动。点启动ISCAgent。 b. Windows防火墙中允许ISCAgent TCP端口2188,同时新建出站、进站规则。允许web端口 52773,超级端口1972。 入站规则中运行文件和打印机共享(回显请求 - ICMPv4-In) 配置主failover成员(Primary failover成员) a. 进入Management Portal界面,选择菜单 系统管理 – 配置 – 镜像配置 – 创建镜像。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 b. 创建Mirror,输入相关信息并保存。 镜像信息部分 : 镜像名称(Mirror Name) : 有效的名称必须是1至15个字母数字字符;小写字母会自动替换为大写字母的对应物。 要求SSL/TLS (Use SSL/TLS): 指定是否要为镜像内的所有通信要求SSL/TLS安全(建议)。如果你选择了 "需要SSL/TLS",而实例还没有一个有效的SSL/TLS配置用于镜像,在完成这个程序之前,你可以直接点击设置SSL/TLS链接,在这个成员上创建所需的SSL/TLS配置。你也可以取消创建镜像程序,并浏览到SSL/TLS配置页面(系统>安全管理>SSL/TLS配置)。 使用仲裁器(Use Arbiter): 指定你是否要配置一个仲裁器(建议)。如果你选择使用仲裁器,你必须提供你想配置为仲裁器的系统的主机名或IP地址以及其ISCAgent进程使用的端口(默认为2188)。 使用虚拟IP(User Virtual IP):如果你选择使用虚拟IP,系统会提示你提供一个IP地址、无类别域间路由(CIDR)掩码和网络接口。 故障转移成员的压缩模式,异步成员的压缩模式 : 分别指定在从主站向备份和异步成员传输之前是否压缩日志数据,以及对每个成员使用哪种压缩类型;两者的默认设置都是 "系统选择",它优化了故障转移成员之间的响应时间以及主站和异步站之间的网络利用率。 一般使用默认设置。 Allow Paralle Dejournaling :确定哪种类型的镜像成员可以运行并行的Dejournal。Paralle Dejournaling允许多个作业在单个数据库中处理独立的globals,而不是只限于并行处理独立的数据库。 镜像故障转移成员信息: 镜像成员名:为你在这个系统上配置的故障转移成员指定一个名称(默认为系统主机名称和InterSystems IRIS实例名称的组合)。镜像成员名称不能包含空格、制表符或以这些标点符号 : [ ] # ; / * = ^ ~ ,字母字符在保存前会转换为大写字母。镜像成员名称的最大长度是32个字符。 超级服务器地址: 输入外部系统可用于与该故障转移成员通信的 IP 地址或主机名称。 代理端口: 输入此故障转移成员上 ISCAgent 的端口号,接受提示中提供的已安装代理的端口。 配置备failover成员(backup failover成员) 进入Management Portal界面,选择菜单 系统管理 – 配置 – 镜像配置 – 加入为故障转移。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 镜像名称:创建的镜像名称 其他系统上的代理地址: 输入您在配置第一个故障转移成员时指定的超级服务器地址。 代理端口 :输入您在配置第一个故障转移成员时指定的 ISCAgent 的端口。 InterSystems IRIS 实例名称 : 输入配置为第一个故障转移成员的InterSystems IRIS实例的名称。 配置异步镜像成员 选择 系统管理 – 配置 – 镜像设置 – 加入为异步。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 在‘加入为异步’页面填入创建的第一个镜像成员名称、地址、实例名称。 镜像名称:创建的镜像名称 故障转移系统的代理地址 :输入您在配置所选故障转移成员时指定的超级服务器地址。 代理端口 - 输入您为所选故障转移成员指定的 ISCAgent 端口。 InterSystems IRIS 实例名称 - 输入您配置为选定故障转移成员的 InterSystems IRIS 实例的名称。 选择合适的Async镜像成员类型 修改镜像设置 进入菜单 系统管理 – 配置 – 镜像配置 – 编辑镜像 可以修改设置的各个参数: 添加镜像数据库 创建一个镜像数据库 在主failover成员服务器上,选择系统管理– 配置 – 系统配置– 本地数据库 选择 新建数据库,按照提示输入数据库名称、存放数据库文件位置。注意在输入关于数据库的详情页面,镜像数据库? 选择 是。 在每一个failover成员服务器以及异步成员服务器按照上面步骤同样创建本地数据库。注意在输入关于数据库的详情中确保每一个成员的Mirror DB Name相同(本地的数据库名称可以不同)。 将已有数据库配置为镜像数据库 将主机已有数据库加入镜像 在主failover成员management port中,从菜单中选择 配置数据库 选中需要镜像的数据库,点击 添加到镜像 来添加需要mirror 的数据库 选择需要添加进入Mirror 的数据库并点击添加 此时从镜像监视器 中可以看到 镜像数据库 增加了我们刚才添加的数据库 数据库备份 对此主服务器的需要mirror 的数据库进行备份并获取备份文件,并拷贝至备机。执行备份可以通过management portal 运行实现。 management portal -> 系统管理 -> 配置-> 数据库备份 ->备份数据库列表 系统操作-> 备份 -> 完全备份列表 注意:这里需要关注主机本身journal 的保存时间,因为mirror 的同步机制是主机推journal 给备机,所以如果备份的时间为1月1 日零点,主机journal 保存时间为1天,备份需要2天,则中间1天的时间差所产生的数据是没有办法恢复的。 数据库备份恢复 在备Failover成员的%SYS 命名空间下使用^BACKUP routine, 将备份文件恢复至备机,则可在备机中看到恢复的数据库已只读方式被挂载 caught up 数据库 在备机上进入 系统操作 - 镜像监视器 ,可见备机的镜像有need activation 状态,点击Activate,结束后,下一步点击 catchup。 最终可见备机为 active,caught up 状态。 删除镜像配置 删除镜像配置必须按照下面顺序执行:删除异步成员,然后删除备份failover成员,最后删除主failover成员。 删除异步成员 进入菜单 系统管理 – 配置 – 镜像设置 – 编辑异步: 如果想要移除报表服务的异步成员,使用Leave mirror链接。 如果想要移除所有的链接异步成员以及相关配置,使用Remove Mirror Configuration按钮: 移除备failover成员 想要移除failover成员必须在%SYS命名空间下 执行^MIRROR routine。 a. 在 Terminal中切换到%SYS命名空间,执行d ^MIRROR b. 选择Mirror Configuration c. 选择Remove This Failover Member(如果在主failover服务器上操作则选择Remove Other Mirror Member) d. 按照提示操作,最后重启实例. 移除主failover成员 想要移除failover主成员必须在%SYS命名空间下 执行^MIRROR routine。 a. 在 Terminal中切换到%SYS命名空间,执行d ^MIRROR b. 选择Mirror Configuration c. 选择Remove This Failover Member d. 按照提示操作,最后重启实例. e. 选择Remove This Failover Member f. 按照提示操作,最后重启实例. 移除镜像数据库 从Async成员中移除数据库不会对failover成员的数据库有任何影响,但是如果从failover成员中移除数据库,也必须从其他failover成员以及Async成员中移除相应的数据库。想要从镜像配置中整体移除数据库需要遵循下面的顺序:主Primary failover成员 -> 备份Backup failover成员 -> Async成员。 a. 进入菜单 系统操作 – 镜像监视器 b. 在镜像数据库中点击 移除 断开连接/开始连接镜像成员 可以临时断开备failover镜像成员或者Async镜像成员。 进入菜单 系统操作 – 镜像监视器 选择 在这个成员上终止镜像 在虚拟环境下配置镜像操作 在虚拟环境下进行镜像配置,同时建议进行下面配置以提高可靠性: · 应该为每一个failover成员进行虚拟主机(virtual host)的配置,保证每一个failover成员不会指向同一个物理上的host。 · 为了避免单一指向存储的损坏,每一个failover成员上Caché实例使用的存储应该固定分配到相互隔离的磁盘阵列或者磁盘组中。 · 有些虚拟架构下自动执行的操作,比如虚拟主机迁移到备用存储,可能造成failover成员间的短暂连接中断。如果在记录中竟让发现类似这样的中断警告,可以进入修改镜像配置的页面,在Advanced Mirror Settings下适当提高QoS Timeout设置的时间。 · 当进行计划维护操作(比如快照snapshot管理)时,会引起镜像成员中的连接中断,可以在备机的Mirror Monitor页面选择Stop Mirror on this server,临时断开备份backup成员,以避免相应的mirror警告信息。 · 在配置Mirror主备服务器中,不建议使用systemctl 设置开机自动启动IRIS。因为在主备切换过程中,如果使用systemd启动关闭IRIS不是成对出现,或者使用iris start/stop instance 不是成对出现,则有可能出现不可预知错误。 配置成功状态 主机状态: 备机状态:
文章
Hao Ma · 十月 28, 2024

配置IRIS Container - CPF merge

## CPF merge(合并) [Automating Configuration of InterSystems IRIS with Configuration Merge](https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ACMF) CPF merge通过合并一个人工编辑的merge file, 自动的配置新创建的iris instance, 或者修改已有的iris instance。适用于: - 修改iris的系统配置(cpf文件中的内容),比如系统参数,创建或者配置用户,角色,权限, 创建或者配置命名空间,数据库; 配置mirror, ECP连接等等。 - 操作不在cpf文件中的内容,比如 [CreateApplication](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RACS_createapplication), [CreateSSLConfig](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RACS_createsslconfig) 等等, 一般是在 [Action]部分实现 > Caché 和早期的IRIS版本提供了manifest功能,用来做IRIS实例的配置。 Manifest很繁琐,而且各个版本的配置中有细微的区别,非常难以管理。 如今有了CPF merge, maifest的所有功能都可以在CPF merge实现, 因此manifest在新版IRIS中也就完全被替代了。 ![figure](https://docs.intersystems.com/iris20231/csp/docbook/images/adock_merge_example.png) ### 执行merge 执行merge可以在操作系统命令行下执行, 如下面的例子 ```bash # 第2个参数可选,如果为空,自动使用系统当前的iris.cpf $ iris merge iris /external/irismerge.conf /usr/irissys/iris.cpf ``` 然而, 在执行`docker run`命令或者`docker-compose`里不用这么麻烦。 IRIS镜像提供了一个功能, 通过加入ISC_CPF_MERGE_FILE环境变量,IRIS会自动实现CPF合并。 比如下面的compose配置: ```bash iris2024: image: containers.intersystems.com/intersystems/irishealth-arm64:2024.1 container_name: iris-a volumes: - ./iris2024:/external environment: - TZ=CST-8 - ISC_CPF_MERGE_FILE=/external/merge.cpf ``` > **IMPORTANT:** > > 当使用配置合并部署容器时(如 [使用合并文件部署 InterSystems IRIS 容器](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ACMF#ACMF_deploy_container) 中所述),只要容器在运行,**ISC_CPF_MERGE_FILE**(它在容器中是持久的)指定的合并文件就会持续受到更新监控,更新发生时,iris 合并命令会立即对其进行合并。这意味着您可以随时通过更新合并文件来更新容器化实例的配置,从而更容易自动重新配置容器化实例和群集。 ### merge文件的Example #### 配置IRIS参数 ```zsh [config] bbsiz=-1 globals=0,0,1024,0,0,0 routines=512 gmheap=256000 [SQL] DefaultSchema=user TimePrecision=6 [SqlSysDatatypes] TIMESTAMP=%Library.PosixTime ``` #### 创建用户和权限 ```zsh CreateUser:Name=SQLAdmin,PasswordHash=fce110ae1f79b9d7e20367a3352efeb48ef22cc8810c4598791f3fb752eabcfe7b2d9ce75099e626b03a62fc6a146f1ca772789ebbcea276674c558c63af4f7b,9ffbbc8ef25086e4d4da87e20c6ea43e8ebb6d1ab64815aef3b1f7e8964dbd87efe68c8464a6b40865efc7d0d568c601e2a49917326dfd78197b68f1bde59db2,10000,SHA512 GrantAdminPrivilege:Grantee=SQLAdmin,Namespace=USER,AdminPriv="%DB_OBJECT_DEFINITION,%BUILD_INDEX" CreateUser:Name=CCHUser,Password=Demo1234 GrantAdminPrivilege:Grantee=SQLAdmin,Namespace=HCC,AdminPriv="%DB_HCC,%BUILD_INDEX" ``` #### 创建命名空间 ```zsh # part of merge.cpf [Actions] CreateResource:Name=%DB_DEMO,Description="The DEMO database" CreateDatabase:Name=DEMO,Directory=/usr/irissys/mgr/demo,Resource=%DB_DEMO, CreateNamespace:Name=DEMO,Globals=DEMO,Interop=1 ``` #### 创建Web Application ```zsh [Actions] CreateApplication:Name=/csp/demo, InboundWebServicesEnabled=1, AutheEnabled=1, DispatchClass=HCC.Interface.RestHandler, NameSpace=DEMO CreateApplication:Name=/csp/demo,NameSpace=HCC,AutheEnabled=36,DispatchClass=HCC.Interface.RestHandler, CreateApplication:Name=/test2,NameSpace=HCC,AutheEnabled=$$$AuthePassword+$$$AutheUnauthenticated,Enabled=1,Description="test2" ModifyApplication:Name=/test2,MatchRoles=":%DB_HSCUSTOM:%DB_HSLIB:%DB_IRISSYS:%HS_DB_HCC:%HS_DB_HSSYS",ErrorPage=%CSP.Error ``` #### System Security Setting System > Security Management > Authentication/Web Session Options - (security settings) - Allow Unauthentication access - Allow O/S authentication ```zsh # example ModifyService:Name=%Service_Monitor,Enabled=1,ClientSystems=192.168.1.1 ModifyService:Name=%Service_DocDB,Enabled=1,AutheEnabled=$$$AuthePassword ModifyService:Name=%Service_Terminal,AutheEnabled=$$$AuthePassword+$$$AutheUnauthenticated+$$$AutheOS ModifyService:Name=%Service_Mirror,Enabled=1 ``` 其他还有更多的用法,请参见在线文档。
文章
Claire Zheng · 三月 1, 2021

欢迎为中文社区参赛者投票!

本周进入 InterSystems 编程大奖赛 的投票时间! 此次中国有多位参赛者,我们将其项目罗列在此,欢迎投票! 项目一: Dictionary comparison scheme of cache database Author: Weiwei Yang 概述:现场需要将各个科室部门内的数据统一汇总到医院总部,但是汇总后发现各个科室使用的字典并不统一,需要将表中的现存的字典统一更换为医院制定字典。例如:A科室中人员的性别字典使用0/1/2表示各种性别,B科室中性别字典使用F/M/O表示各种性别,但是现在医院要求所有性别字典保存Female/Male/Other性别信息,此时就需要替换原有的性别字典为新用字典。当初,此处只是列举了一个使用场景,未来有多个需要对照字典的工作都可以考虑此项目的设计和实现思想。 点击投票 项目二: HealthInfoQueryLayer Author: Botai Zhang 基于Intersystems IRIS平台整合医院信息查询业务解决方案 概述:随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们基于Intersystems IRIS数据平台整合医院信息查询业务解决方案。该应用程序可通过配置完成查询业务接口实现,大大缩小开发、维护、实施等项目关键运转周期。 点击投票 项目三: Integration scheme for heterogeneous messages in heterogeneous systems Author: Deming Xu 异构系统和异构消息的集成方案 概述:随着现代医院建设的信息化程度越来越高,对接的子系统数量也越来越多,系统的架构、接口类型、消息结构越来越复杂,对医院系统之间的信息传递造成很大不便。为了解决该问题,我们采用HL7、XML等标准,使用Ensemble内置的数据转换工具(DT),将异构系统的接口进行标准化(通常引用Soap、REST、TCP/IP等标准协议),使得不同架构的系统,即时接口类型不同、消息模型不同,也能进行数据的传输。 关键词:HL7、XML、Settings、DataTransform、JDBC、SQL 点击投票 项目四: Create a unified hospital data extraction scheme based on IRIS for Health Author: Deming Xu 基于 IRIS for Health 创建医院数据统一提取方案 概述:随着医院信息化建设内容不断丰富,业务面覆盖越来越广,相关科研项目的数据需求也越来越多,医院对各个业务系统的数据管理提出了新的要求。由于科研项目背景多样,需求中的数据模型也不尽相同,各个系统的接口开发、接口管理、代码维护工作也变得越来越繁杂。针对这一困境,我们采用IRIS创建医院数据统一提取方案 。该应用程序提供一个公共的数据提取服务(BS),可通过配置完成获取多个不同数据源的接口开发(多个BO),大大缩小开发、维护、实施等成本。 点击投票 项目五: RESTFUL_API_For_Hotel_OverBooking_System Author: jingqi LIu Develop RESTFUL Data API in InterSystems IRIS Data Platform Development for Hotel Overbooking Management System. PS:The overbooking management system combines the unique conditions of the hotel, such as room prices, order channels, customer needs (etc...). System uses machine learning algorithms (such as: KNN/ES-RNN...) to accurately predict the daily no-show and occupancy rate of the hotel, and further combines with the revenue equation to find the best largest room sales volume, which can significantly increase the hotel marginal revenue. 这是一个在InterSystems IRIS中用ObjectScript构建的REST API应用的演示。它也有OPEN API规范,可以用Docker和VSCode开发,可以作为ZPM模块部署,可以作为Overbooking系统数据的REST api使用。 点击投票 Useful! 新用户投票前必读哦:如何成为社区活跃用户(Active user) 这几个医疗行业应用都非常不错,学习到很多! 欢迎为您喜欢的选手投票! 欢迎新加入的朋友们发言、评论、回复成为活跃用户后为中国参赛选手投票,每人可以投3票! @Hao.Wang @z.c @Zhaoying.Li @Neal.Wu @liu.yaquan @qu.qu @wang.wei @guo.meiya @yajing.xu @yue.li @权权.苏 @xiaohu.xiong @yadong.zhao @Yi.Han @Wen.Zhou @jie.zhang @张.恒 @guo.wenheng @Jing.Li3826 @迪.文 这个贴子很棒!完美的解决了我的问题! 欢迎新朋友,请大家发表内容时尽量在中文社区发表,多发表高质量内容,为中文社区多做贡献, 包括但不限于回答问题,撰写文章,贡献软件库、代码、工具等等,多谢支持! @young.zheng @an.xingqi2532 @jinhui.hu @wenyang.zhang @guoguo.wang @shikai.ren @chaolong.huang @yabin.duan @鹏飞.楚 @智辉.李 @shan.hu @Wendy.Wu 好的,谢谢 马上投票 发布完还要等24小时 你好,第一次发帖24小时后就可以投票吗 准备投票 是的 原来是这样,明白了 期望多一些应用,多多学习! 能够学习到具体的应用,很棒!👍 学习IRIS在国内多行业应用,棒👍 好的,谢谢! 感谢提醒,👍
文章
Veerarajan Karunanithi · 二月 28, 2024

使用 SQL 文本搜索从非结构化数据中获取见解

什么是非结构化数据?非结构化数据是指缺乏预定义数据模型或组织的信息。与数据库中具有清晰结构(例如表和字段)的结构化数据相比,非结构化数据缺乏固定的模式。此类数据包括文本、图像、视频、音频文件、社交媒体帖子、电子邮件等。 为什么来自非结构化数据的见解很重要?根据 IDC(国际数据公司)的报告,预计到 2025 年,全球 80% 的数据将是非结构化的,这将成为 95% 企业的重大担忧。 福布斯文章 人工智能世界如何解决这个问题?在人工智能领域,生成式人工智能在为非结构化数据提供解决方案方面发挥着至关重要的作用。它擅长从文本/图像/视频中提取有价值的信息、文本摘要和处理文档等任务。 Intersystems 非结构化数据解决方案Intersystems IRIS 提供了一种称为“SQL 文本搜索”的特殊解决方案,用于搜索非结构化数据。此功能有助于对多种语言的非结构化文本数据进行语义上下文搜索。 使用 SQL 文本搜索有什么优点? 快速搜索: InterSystems IRIS SQL 搜索利用优化的索引生成快速导航大量数据,避免对数据本身进行顺序搜索。 单词感知搜索:与基本字符串搜索不同,SQL 搜索依赖于文本中的语义结构,以单词为基本单位。这种方法最大限度地减少了嵌入字符串或跨越两个单词的字符串引起的误报。 实体感知搜索: SQL 搜索考虑语义关系以将多个单词分组为实体。它可以搜索指定的单词序列、邻近的单词(无论顺序如何)以及实体开头或结尾的单词,从而实现精确的上下文搜索。 语言感知搜索:识别语义关系是特定于语言的,SQL 搜索合并了十种自然语言的语言模型。它还支持其他语言,无需创建词典或本体。 模式匹配: SQL 搜索为字符模式提供通配符和正则表达式 (RegEx) 匹配。 模糊匹配: SQL 搜索包括近似匹配的模糊搜索功能,考虑到搜索字符串的计算变异程度。即使出现拼写错误,这也有助于匹配。 派生匹配: SQL 搜索采用分解来匹配根词和组成词,并利用同义词表来匹配同义词和短语。 如何使用非结构化数据实现 SQL 文本搜索:MIND 的实际示例 为了演示 SQL 文本搜索对非结构化数据的实现,我们将使用 Microsoft 新闻数据集 (MIND) 作为示例,重点关注小型训练集。 注意:提供的示例使用 User 命名空间,但您可以将其替换为您选择的任何合适的命名空间,确保所有操作都发生在同一命名空间内。 第 1 步:下载并提取训练数据从 MIND 下载 MIND 训练数据集MIND (msnews.github.io)并从存档中提取 news.tsv 文件。该文件以制表符分隔,我们将主要关注“类别”、“标题”和“描述”字段。 第 2 步:创建持久类创建一个名为“Test.JSON”的持久类,其属性为“Title”(字符串)、“Category”(字符串)和“Description”(字符串)。专门为“Description”属性创建 %IFind.Basic 索引,以增强文本搜索性能。创建索引后,编译该类。 第 3 步:加载 MIND 数据集将 MIND 数据集加载到新创建的类中。您可以使用类和对象方法或 SQL 来填充该表。以下代码演示了使用类和对象方法加载数据集。 第 4 步:验证数据集加载加载数据集后,查询表以确保它准确包含预期的行。您可以使用终端中的 SQL 管理门户或 SQL Shell 进行此验证。 第 5 步:利用索引进行查询现在,利用特定索引来设计查询并提取见解。例如,您可以使用以下查询: 检索微软公司新闻: SELECT %iFind.Highlight(Description, '"microsoft*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"microsoft*"' , 0 , 'en' ) 检索Google公司新闻: SELECT %iFind.Highlight(Description, '"google*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"google*"' , 0 , 'en' ) 检索 Google 和 Microsoft 的合并新闻: SELECT %iFind.Highlight(Description, '"microsoft*" "google*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"microsoft*" "google*"' , 0 , 'en' ) 免责声明:请务必注意,语义和分析 SQL 搜索索引使用 InterSystems IRIS 自然语言处理 (NLP),而 InterSystems 已弃用该技术。截至最新社区版版本(2023.3.0),该功能仍然有效,但在未来版本中可能会被删除。使用 SQL 文本搜索的风险由您自行承担。 我将使用已弃用的 SQL 文本搜索的替代选项来撰写本文的续篇。如果您喜欢我的文章,请在下面投票并提出您的宝贵建议。谢谢你! 解说视频 Thank you and looking fwd to more posting in CN !
文章
Tianyu wu · 三月 3, 2021

欢迎大家来给我们投票啦!

这是我们团队参加的第一届InterStstems编程竞赛! 快来看看投票给我们! 超额预订管理系统结合了酒店业的独特条件,例如房价,订购渠道,客户需求等。 本系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益结合以找到最佳的最大客房销售量,从而精准增加酒店的边际收益。 移步欣赏作品点击如下连接 https://github.com/BroadCastAir/hotel_api & https://github.com/BroadCastAir/Hotel_OverBooking_Sys 投票给我们点击: Check the related application on InterSystems Open Exchange 我们ISC 中国也想跟您聊一下合作事宜,请 @Jun.Qian 联系一下,谢谢! good! 很棒的应用! 非常棒!很好的应用!