搜索​​​​

清除过滤器
文章
姚 鑫 · 九月 1, 2022

第十九章 维护本地数据库(四)

# 第十九章 维护本地数据库(四) # 压缩数据库中的全局变量 管理数据库空间的另一种方法是使用 `^DATABASE` 例程压缩数据库中的全局变量。压缩全局变量将全局数据合并到更少的块中,从而增加数据库中的可用空间量。 在创建和更新全局变量时 `IRIS` 通常以将全局块填充到大约 `70%` 容量的方式分配数据。 (完全按整理顺序增长的全局可能会分配到接近 `90%`。)通常,允许 `IRIS` 自动管理全局块密度就足够了。然而,一些不连续的数据删除模式可能会显着降低平均全局块密度。 **注意:要逐个全局地查看数据库中全局块的当前密度,可以运行完整性检查、并检查每个全局的数据级别输出。** 压缩全局变量时,指定所需的全局块密度(默认为 `90%`),操作会尝试通过合并数据来尽可能接近此值——例如,将分布在三个块中的全局数据重新排列为两个。通常(但并非总是),压缩全局变量会显着增加数据库中可用的可用空间。 (如果指定的目标密度低于数据库当前的全局块密度,则数据库的大小不会增加。) 要压缩数据库中的全局变量,请使用以下过程: 1. 打开终端并更改为 `%SYS` 命名空间。 2. 输入 `do ^DATABASE`,然后从菜单中选择 7) `Compact globals in a database`。 ```java %SYS>do ^DATABASE 1) Create a database 2) Edit a database 3) List databases 4) Delete a database 5) Mount a database 6) Dismount a database 7) Compact globals in a database 8) Show free space for a database 9) Show details for a database 10) Recreate a database 11) Manage database encryption 12) Return unused space for a database 13) Compact free space in a database 14) Defragment a database 15) Show background database tasks ``` 3. 指定要在其上运行操作的数据库的目录。可以通过输入来指定多个数据库?在数据库目录压缩`?`提示,然后输入数字列表。 ```java Database directories to compact? ? 1) c:\intersystems\irishealth\mgr\ 2) c:\intersystems\irishealth\mgr\hscustom\ 3) c:\intersystems\irishealth\mgr\hslib\ 4) c:\intersystems\irishealth\mgr\hssys\ 5) c:\intersystems\irishealth\mgr\irisaudit\ 6) c:\intersystems\irishealth\mgr\irislocaldata\ 7) c:\intersystems\irishealth\mgr\iristemp\ 8) c:\intersystems\irishealth\mgr\user\ (Multiple selections allowed: * for all, or list such as 1,4,7-10) ``` 4. 指示您要压缩所有全局变量,或者输入要压缩的单个全局变量列表。 ```java Database directories to compact? 8 c:\intersystems\irishealth\mgr\user\ Databases Selected ------------------ c:\intersystems\irishealth\mgr\user\ ``` 5. 指定目标平均全局块密度,响应其余提示,并确认。 ```java All Globals? Yes => yes 34 items selected from 34 available globals How full do you want the database blocks? 90 => 50 Display compacted globals? No => n Device: "" Right margin: 80 => 50 Confirm compaction of databases? Yes => yes Database Compaction Aug 20 2022 5:49 PM Database c:\intersystems\irishealth\mgr\user\ Global MB Processed MB Compres sed To Completed ------ ------------ ---------- ------ --------- ^IRIS.Msg 0 0 5:49 PM ^IRIS.MsgNames 0 0 5:49 PM ^IRIS.SASchema 0.008 0.008 5:49 PM ^ISC.Src.Jrn 0.008 0.008 5:49 PM ^ISCMethodWhitelist 0.008 0.008 5:49 PM ^ROUTINE 0.008 0.008 5:49 PM ^oddBIND 0 0 5:49 PM ^oddCOM 0.016 0.016 5:49 PM ^oddDEF 0.016 0.016 5:49 PM ^oddDEP 0.008 0.008 5:49 PM ^oddEXT 0.008 0.008 5:49 PM ^oddEXTR 0 0 5:49 PM ^oddMAP 0 0 5:49 PM ^oddMETA 0 0 5:49 PM ^oddPKG 0 0 5:49 PM ^oddPROC 0 0 5:49 PM ^oddPROJECT 0.008 0.008 5:49 PM ^oddSQL 0 0 5:49 PM ^oddStudioDocument 0 0 5:49 PM ^oddStudioMenu 0 0 5:49 PM ^oddTSQL 0 0 5:49 PM ^oddXML 0 0 5:49 PM ^rBACKUP 0 0 5:49 PM ^rINC 0 0 5:49 PM ^rINCSAVE 0 0 5:49 PM ^rINDEX 0.008 0.008 5:49 PM ^rINDEXCLASS 0.008 0.008 5:49 PM ^rINDEXEXT 0.10 0.10 5:49 PM ^rINDEXSQL 0.008 0.008 5:49 PM ^rMAC 0 0 5:49 PM ^rMACSAVE 0 0 5:49 PM ^rMAP 0.008 0.008 5:49 PM ^rOBJ 0.008 0.008 5:49 PM ^rPYC 0.008 0.008 5:49 PM ``` **注意:紧凑的全局操作旨在与正常的数据库活动同时运行。但是,该操作确实会消耗一些系统资源,并且如果系统处于极高负载下,则可能无法完成。出于这些原因, 建议在非高峰时间运行此和其他数据库重组操作(包括压缩数据库和对全局进行碎片整理),并且一次只在系统上运行一个此类操作**。 **全局压缩可能涉及临时增加正在压缩的数据库大小。如果这导致数据库达到其配置的最大大小,或者由于存储卷上的可用空间不足而无法进行扩展,则取消操作。**
文章
Hao Ma · 一月 4, 2023

IRIS, Caché监控指导 - 介绍

本文章是一个系列,主要目的是介绍给IRIS,Caché的终端用户如何方便的监控您的系统。 InterSystems系统的监控很难吗?需要学习很多技术吗? 我的答案是还好。 关于Caché和IRIS监控,无论是那部分内容,在InterSystems的在线文档或者开发者论坛,其实都能找到相关的说明和方案。但问题是太多,太杂乱,没有一个“操作维护手册”的东西。结果是,如果您是一个新手的InterSystems产品的维护工程师或者管理员,您要花很多的时间在大量的文档里找答案。 还有一个问题是文档中很多章节的内容又太深,包含了一些开发人员才关心的内容,这是Caché或者IRIS的特性造成的,因为它首先是一个开发平台。结果是,对于管理员,很多文档的很不友好。 因此,我要写的这个文章的的目的是这样的: - 简单。只介绍管理维护人员需要的内容。只介绍和监控相关的内容。其他比如备份恢复,扩容,修改配置等等基本不涉及。 - 易学。文章的期待读者是系统管理员,因此不需要您有编程能力或者InterSystems编程语言的基础。我系统对您的每个日常工作和关注的主题,给出最容易实现的操作步骤。 - 对读者的要求低,您只需要了解基本的Caché操作,包括 - Caché的用户维护界面 - 操作终端(Terminal)的操作 - 基本的Caché命令的格式 让我们进入主题。有几个要点要先交代一下。 ### InterSystems产品的几个使用的场景 也就是谁在用什么产品 - 场景一:东华的iMedical用户 iMedical 8.5之前的版本使用Caché。 2022年版本8.5发布并开始部署,它的底层是InterSystems IRIS。 - 场景二:独立的InterSystems IRIS实例或者InterSystems HealthShare InterSystems HealthShare是在IRIS平台上面构建的数据共享平台,用于多个医疗机构之间的数据共享,通常会由多个InterSystems IRIS实例组成。本文并不介绍HealthShare的具体技术,您如果是HealthShare的用户,可以通过本文了解单一的IRIS实例的监控。 - 场景三: 医院的集成平台Ensemble用户 从监控维护的角度讲,Ensemble和Health Connect对于医院用户其实是一个东西。Health Connect是最近一些年InterSystems公司对医疗行业使用的Ensemble的一个产品名称。在后面的文章里, 我会只用Ensemble这个名字。 ### 什么是系统监控 简单说,监控工作基本就两块: 1. 监控告警和日志 简单的说,当系统有需要管理员关注的事件发生时,管理员可以及时得到通知。关注的事件通常包括底层的告警,比如CPU占用或者数据库组件出错,或者上层应用的事件,比如一个消息队列太长了。 2. 指标的测量 如果要监控的系统本身有完美的日志和告警通知,那么指标的检测就不那么重要。但实际场景中,用户不仅要检测客户化的上层应用指标,也希望看到底层的指标值,哪怕仅仅是为了展示。 这时候,就需要一个好的指标测量的方案。这里“好的方案”的意思是稳定,易于维护,容易客户定制化的修改。 ### 本文章的组织和您可能感兴趣的内容 如果您是新手,请让我先来强调一下IRIS, Caché和Ensemble的区别 - IRIS, Cache'是开发平台,而不仅仅是数据库。 ​ 举例来说,iMedical的生产环境有很多“应用服务器”,它们是一个个单独部署的Caché实例。它们并不存数据,而仅仅是应用。因此对Caché应用服务器的监控肯定是和数据服务器是不一样的。 - Ensemble是一个应用 Ensemble是在Caché平台上的开发出的消息引擎框架(framework)。它内置了很多用于消息分发传递的组件,用于搭建一个消息引擎。如果只用内置的组件,那么Ensemble几乎可以被看成一个应用。但现实实施中,程序员会使用已有的组件,适配器等开发定制化的组件,这时候Ensemble就是一个开发框架。 无论如何,Ensemble是工作在Cache'或者IRIS之上的,所以Ensemble的维护人员一定要先学维护Cache'或者IRIS。 综上所述, InterSystems产品的监控包括 - IRIS或者Caché的监控(适用于上面所有3个场景的维护人员),包括的内容 - [IRIS,Caché健康检查](./IRIS和Caché健康检查建议.md) - [IRIS,Caché的日志和错误]() - [指标(metrics)的监控] - 数据库性能的监控(适用于场景一,场景二的维护人员) - SQL性能的监控 - 索引的使用情况的监控 - Ensemble的监控(适用于上面场景三的维护人员), 包括 - Ensemble的日志和错误]() - Ensemble的消息统计 除了最基本的监控有关的工作,文章内容里还会包括最基本的和系统健康检查,提交测试报告的内容。也会介绍一些工具,比如SNMP, InterSystems SAM等等。我在工作中了解的一些用户的好的方案,实现等等, 也会和各位分享。 请看下一篇 [IRIS, Caché监控指导(1)-健康检查](https://cn.community.intersystems.com/post/iris-cach%C3%A9%E7%9B%91%E6%8E%A7%E6%8C%87%E5%AF%BC-%E7%B3%BB%E7%BB%9F%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5)
文章
Claire Zheng · 七月 20, 2021

扫码看回放 | InterSystems极客俱乐部线上直播课:Health Connect 系统运维培训

InterSystems极客俱乐部线上直播课“Health Connect系统运维培训”回放已准备好,欢迎您点击报名,扫码看回放!
文章
Michael Lei · 五月 16, 2021

将普通 ObjectScript 持久化类暴露为 FHIR 代码系统和值集

[FHIR 术语服务](https://www.hl7.org/fhir/R4/terminology-service.html)规范描述了一组对 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html)、[ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 和 [ConceptMap](https://www.hl7.org/fhir/R4/conceptmap.html) 资源的操作。 在这些操作中,以下四种操作似乎是最为广泛采用的: | CodeSystem | ValueSet | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [$lookup](https://www.hl7.org/fhir/R4/codesystem-operation-lookup.html)[$validate-code](https://www.hl7.org/fhir/R4/codesystem-operation-validate-code.html) | [$expand](https://www.hl7.org/fhir/R4/valueset-operation-expand.html)[$validate-code](https://www.hl7.org/fhir/R4/valueset-operation-validate-code.html) | 开发该规范的部分实现一直是探索 IRIS for Health 2020.1 中引入的[全新 FHIR 框架](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_intro#HXFHIR_server_arch)的有效途径。 本[实现](https://github.com/intersystems-ru/fhir-terminology-service)包括上述四种操作,并支持与 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html) 和 [ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 资源的[读取](https://www.hl7.org/fhir/R4/http.html#read)和[搜索](https://www.hl7.org/fhir/R4/http.html#search)交互。 需要注意的是,本实现使用普通 ObjectScript 持久化类作为源术语表。 ### 安装和测试示例策略 下面列出了安装和基本测试步骤: 1. 安装 IRIS for Health 2020.1 或更新版本。 2. 使用门户的 `System Administration` > `Configuration` > `System Configuration` > `Namespaces` 菜单或在 HSLIB 命名空间中运行命令 `do ##class(HS.HC.Util.Installer).InstallFoundation("")` 来建立一个新的命名空间。 然后从 [intersystems-ru/fhir-terminology-service](https://github.com/intersystems-ru/fhir-terminology-service) GitHub 仓库的 [src/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/src/cls/) 和 [samples/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/samples/cls/) 文件夹导入类。 3. 基于 R4 数据集以及在 [dummy-search-parameters.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/fhir-search-parameters/dummy-search-parameters.json) 中定义的附加搜索参数,创建一个自定义 FHIR 元数据集。 这可以使用 `##class(HS.FHIRServer.ConsoleSetup).Setup()` 交互实用工具或运行以下命令来完成: ``` do ##class(HS.FHIRServer.Installer).InstallMetadataSet("", "", "HL7v40", $lb(""), 1) ``` * 为了使 `$expand` 和 `$validate-code` 操作支持 HTTP GET 请求,此步骤是必需的。 * 请注意,与 InterSystems IRIS 一起打包的 FHIR 元数据集文件位于 `/dev/fhir/fhir-metadata` 目录中。 4. 基于新的元数据集和 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 类创建一个新的 FHIR 端点。 同样,这可以使用交互实用工具或运行以下命令来实现: ``` do ##class(HS.FHIRServer.Installer).InstallInstance("", "Sample.iscru.fhir.fts.SimpleStrategy", "") ``` 5. 允许对新端点进行未经身份验证的访问:使用交互实用工具或运行以下[命令](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_install#HXFHIR_server_install_program_configure): ``` set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint("") set config = strategy.GetServiceConfigData() set config.DebugMode = 4 do strategy.SaveServiceConfigData(config) ``` 6. 填充 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls): ``` do ##class(Sample.iscru.fhir.fts.model.CodeTable).Populate(10) ``` 7. 将 [fhir-terminology-service.postman_collection.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/tests/postman/fhir-terminology-service.postman_collection.json) 文件导入到 Postman 中,调整集合内定义的 `url` 变量,然后针对 `Sample.iscru.fhir.fts.model.CodeTable`(一个简单的持久化类)测试服务。 ### 支持的 FHIR 交互 目前 CodeSystem 和 ValueSet 都支持的唯一搜索参数是 `url`。 上述四种操作均支持 HTTP GET 和 HTTP POST 方法。 下表列出了一些针对 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls) 类的可能 HTTP GET 请求。 | URI(前面加上 `http://:`) | 描述 | | ---------------------------------------------------------------------------- | ------------------------------------------------------------- | | /metadata | 获取端点的能力描述资源。 | | /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 CodeSystem 资源。 | | /ValueSet/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 ValueSet 资源。 | | /CodeSystem?url=urn:CodeSystem:CodeTable | 通过 url 搜索 CodeSystem 资源。 | | /CodeSystem | 输出所有可用 CodeSystem 资源。 | | /ValueSet?url=urn:ValueSet:CodeTable | 通过 url 搜索 ValueSet 资源。 | | /ValueSet | 输出所有可用 ValueSet 资源。 | | /CodeSystem/$lookup?system=urn:CodeSystem:CodeTable&code=TEST | 在给定系统和代码的情况下,获取有关该概念的所有详细信息。 | | /ValueSet/$expand?url=urn:ValueSet:CodeTable | 展开 ValueSet。 | | /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable/$validate-code?code=TEST | 验证某个代码是否在代码系统中。 | ### 创建自定义策略 为了将您自己的持久化类公开为 FHIR 代码系统/值集,您需要创建自定义策略类,方法是先将 [iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 子类化,然后基于新的自定义策略创建 FHIR 端点(请参见上面的安装步骤 4)。 您的策略类必须覆盖一个类参数和至少三个方法: * `StrategyKey` 类参数应该被指定一个唯一值。 当前类的名称似乎是一个好选择。 * `getCodeTablePackage()` 类方法应该返回通过[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 标识的给定代码系统(或值集)的包名称。 通常,所有术语类都属于一个包,因此该方法通常会返回一个相同的包名称,不管参数值如何。 * `getCodePropertyName()` 和 `getDisplayPropertyName()` 类方法应该返回与 `code` 和 `display` 概念元素对应的类属性的名称。 不同的类可能有不同的属性映射到术语 code/display 元素。 [iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 的其他可能适合覆盖的方法和参数如下: * `listCodeTableClasses()` 类方法需要覆盖,才能支持以返回所有可用代码系统(或值集)为结果的搜索请求。 此方法应该返回所有可用术语类的类名称列表。 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 包含此方法的以下基本实现: ``` /// Returns a list of all available code table classes. ClassMethod listCodeTableClasses() As %List { #dim sql As %String = "SELECT name FROM %Dictionary.ClassDefinition WHERE name LIKE '" _ ..#codeTablePACKAGE _ ".%' ORDER BY name" #dim resultSet As %SQL.StatementResult = ##class(%SQL.Statement).%ExecDirect(, sql) if (resultSet.%SQLCODE '= 0) && (resultSet.%SQLCODE '= 100) $$$ThrowStatus($$$ERROR($$$SQLError, resultSet.%SQLCODE, resultSet.%Message)) #dim return As %List = "" while resultSet.%Next() { set return = return _ $lb(resultSet.name) } quit return } ``` * 如果您的持久化类的任何特定属性都不应出现在 CodeSystem 资源中,则需要覆盖 `isExcludedProperty()` 类方法。 默认情况下,此方法会过滤掉 `Collection`、`Identity`、`Internal`、`MultiDimensional` 和 `Private` 属性。 需要注意的是,对象引用和流属性当前不受框架支持并被忽略。 * `codeSystemUrlPREFIX` 和 `valueSetUrlPREFIX` 类参数以及 `getCodeSystemForClassname()`、`getValueSetForClassname()`、`determineCodeTableClassname()` 和 `determineCodeSystemForValueSet()` 方法控制类名称与[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 相互映射的方式。 默认情况下,对规范 URL 使用以下命名方案: | CodeSystem | ValueSet | | ----------------------------------------- | --------------------------------------- | | `urn:CodeSystem:` | `urn:ValueSet:` | 请注意,CodeSystem/ValueSet 资源的[逻辑 id](https://www.hl7.org/fhir/R4/resource.html#id)(也就是服务器 id)等于其对应类的全名。 ### 待完成功能 目前缺少的是对代码系统版本管理、概念层次结构和 `$subsumes` 操作、ConceptMap 资源以及其他许多内容的支持。 欢迎发表意见和拉取请求!
公告
Claire Zheng · 七月 4, 2022

2022年全球峰会主题演讲线上观看!

大家好! 一周前,在西雅图举办的InterSystems 2022年全球峰会刚刚结束,但对于那些错过会议现场的人,或者由于种种原因无法亲自参加会议的人(或者只是希望重新回忆并再次聆听会议的人)来说,线上主题演讲刚刚开始! 话不多说,请查收全球峰会上来自社区的问候: 欢迎通过YouTube播放列表观看2022年全球峰会三天所有主题演讲: ➡️ Global Summit 2022 on InterSystems Developers YouTube 明年,来佛罗里达州好莱坞加入我们吧!🤩 详情在这里.
公告
Michael Lei · 三月 25, 2022

新的在线 Kubernetes 练习!

大家好! 对于那些参加了2021年虚拟峰会的体验实验室的人来说,你可能还记得其中一个实验室会议是围绕Kubernetes进行的。我们现在已经将该实验室转换为完全线上按需使用。你可以启动一个小型的虚拟机集群,并按照练习来管理你的Kubernetes集群,将InterSystems IRIS容器部署到其中,并观察它在摧毁一个吊舱时的自我修复性质。 如果你有兴趣,这是一个很好的Kubernetes介绍。请看这里: 用InterSystems IRIS 和 Kubernetes实现高可用
文章
Claire Zheng · 三月 16, 2022

【极客聊吧】如何为用户提供更好的开发体验(上)

谈到开发体验,什么最重要?如何为客户提供更好的开发体验?InterSystems IRIS的最新版本有哪些新特性极大优化了用户的开发体验?这是本月“极客聊吧”聚焦的话题,我们将通过上、下两期视频进行探讨。在本期视频中,InterSystems中国销售工程师吕正之、马浩和WRC产品支持专家杨乐乐针对以下两点进行了分享:(1)开发语言的多样性与对FHIR的支持;(2)探讨开发平台的前瞻性:对Smart Data Fabric架构的支持。
文章
Weiwei Gu · 九月 28, 2022

使用嵌入式Python生成数据流

Hi Developers, 嗨,各位开发者们: 各位都知道,Python是一个庞大而强大的生态系统,包含了成千上万的库和包,特别是在数据科学方面。 因此,我想首次尝试使用IRIS最近的一项功能--嵌入式Python,简单地导入一个名为datetime的Python库,生成带有时间戳成分的数据,并在InterSystems IRIS for Health Data Platform中持久化。同样的方法在IRIS数据平台上也可以使用。 我把这个小项目分成了两个主要部分。 *按照IRIS for Health Data Platform的文档设置嵌入式Python环境*使用嵌入式Python创建时间戳数据作为例子,并使用datetime包持久化到IRIS。 1. 在 InterSystems IRIS for Health Data Platform 2022.1 上设置嵌入式 Python。 在Windows上,打开CMD terminal C:\InterSystems\IRISHealth\bin>irispip install --target C:\InterSystems\IRISHealth\mgr\python numpy 注意:这是检查嵌入式Python环境的步骤,因为我发现当我使用IRIS 2021.0时,irispip经常不工作。 通过导入一个Python math packge来测试Python功能 打开IRIS终端,在USER命名空间中执行以下程序:set pymath = ##class(%SYS.Python).Import("math") 然后执行write pymath.pi,你可以看到你已经成功调用了Python包,输出结果如下。 USER>write pymath.pi 3.141592653589793116 而我们也可以通过从IRIS terminal打开来启动Python shell。 do ##class(%SYS.Python).Shell() Class User.PythonFirstTry Extends %RegisteredObject{ClassMethod pyHello() As %Status{ set pythonBuiltins = ##class(%SYS.Python).Builtins() do pythonBuiltins.print("Hello World!")}ClassMethod pyForLoop() [ Language = python ]{ for i in range(5): print("Python")}} 我写了两个类方法,你可以试着把它们放在一个.cls文件中,编译一下,看看输出。 执行方法如下: USER>do ##class(User.PythonFirstTry).pyHello() Hello World! USER>do ##class(User. PythonFirstTry).pyForLoop() Python Python Python Python Python 2. 使用python库来生成数据流并持久化到InterSystems IRIS中。 生成数据流所需的Python库: 导入datetime包(这不需要使用CLI进行额外的安装)。除了datetime包,我还尝试使用了其他的库和包,但是其中一些并不在Embedded Python中。要安装这些东西,请打开 CMD terminal (Windows),然后运行以下程序 (XX 将被替换成包的名称)。 C:\InterSystems\IRISHealth\bin>irispip install XX 以下是生成数据并持久化到IRIS的步骤: 1.创建 %Persistent类 2. 创建Property3.设置一个类方法(例如:GetData)并指定[Language = python] 。4.通过调用datetime python库生成数据,使用以下代码片段 注意:timeNow需要被转换为字符串数据类型 5.通过IRIS terminal 执行GetData()方法,执行SQL查询 注意:你可以使用一种简单的 "For " 循环来控制这种方式产生的数据量的规模。 感谢翻译!! @Weiwei.Gu
文章
Qiao Peng · 三月 29, 2021

CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC

Caché Shadow 上次介绍了使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。但早期的Caché并不支持镜像,例如Caché 2008,它只支持Shadow。 在这些早期版本上是否也可以实利用Journal实现类似CDC的功能呢?答案是肯定的,就是利用Shadow服务器的Dejournaling filter routine (Dejournaling过滤器routine)。 Dejournaling filter routine InterSystems Caché的 Dejournaling过滤器routine是一个用户自定义的routine,用于在Shadow服务器上过滤Journal记录。当配置了Dejournaling 过滤器后,Shadow服务器在redo journal前会自动调用Dejournaling过滤器routine。该routine传入参数以下: pid:记录进程ID; dir:源数据库目录; glo:Global节点(包括下标); type: 操作类型,为S (Set)、K (Kill)、s (BITSET)、k (ZKILL); addr:Journal记录在Journal文件中的偏移量; time:记录的时间戳。 该Routine返回1,说明此journal记录需要被Shadow恢复,而返回0说明此journal记录不需要被Shadow恢复。 因为这是一个自定义routine,且会被Shadow服务器恢复Journal时自动调用,因此我们可以利用它记录数据变更。 注意: Shadow配置不在本文内容里,请参考文档: [Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_shadow 编写Dejournaling filter routine Routine的名字可以任意,但这个routine需要保存在Caché Shadow服务器的%SYS下。 例如,将global的数据变更记录在^CDCLog中: MyShadowFilter(pid,dir,glo,type,addr,time) { Set ^CDCLog($I(^CDCLog))=$lb(dir,glo,type,addr) Quit 1 } 配置Dejournaling filter routine 在 Caché Shadow服务器的系统管理门户的[Home] > [Configuration] > [Shadow Server Settings] 上选择已经建立好的Shadow服务器,选择高级(Advanced)设置,在Filter routine里填写上面创建的routine名称即可。 CDC系列 更多的CDC选项实现,请参考: 1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能 2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC 3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系 4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
公告
Michael Lei · 五月 8, 2021

Intersystems IRIS for Health 数据平台医疗版最新在线培训课程--涉及多个Docker 容器的应用开发

在这个一小时的互动课程中,用户可以参与了涉及多个Docker容器的复合应用程序的开发。此外,学员们还学习如何创建数据转换和业务规则,使用业务流程设计器来建立病人护理的逻辑,并使用Spark和PMML将业务操作与机器学习模型连接起来。 赶快来参加我们的线上课程吧: https://learning.intersystems.com/course/view.php?id=1662&ssoPass=1 只有受众组'1.0 HealthShare Content Access'的成员可以自主选课 请问您的账户可以看其他课程吗?
文章
Qiao Peng · 三月 29, 2021

CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系

一些熟悉SQL的用户希望用SQL表的方式获取InterSystems IRIS/Caché的变更数据。知道了Global和SQL表的对应关系,就可以知道是哪一张SQL表数据变化了,甚至通过SQL查询获取变更的数据。下面介绍如何实现这种方式,和注意事项。 获取Global和SQL表的对应关系 通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系;而持久化的对象模型和Global之间也有一一对应关系。建立Global和SQL表的对应关系,通常可以使用以下的SQL查询特定SQL schema下所有表对应的Global: SELECT CC.SqlQualifiedNameQ SQLTable, CS.parent Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= <schemaname> 其中<schemaname>是SQL的Schema名称; 返回字段SQLTable是SQL表名、Class是对象类名、DataLocation是保存数据的Global名称。 多种建模方式Global和SQL表的对应关系的影响 InterSystems IRIS/Caché都是支持多种建模方式的数据平台,常见的建模方式有SQL、面向对象、多维数组。如果之前不了解InterSystems IRIS/Caché的多维数组,可以先简单理解为键值对。无论使用何种建模方式,都可以得到3套模型:SQL模型、对象模型和多维数组存储模型(Global模型)。上面提到通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系。但由于SQL表达模型的局限性, InterSystems IRIS/Caché的对象模型和SQL表之间并不总是一一对应的关系。 下面就逐一分析各种建模方式下,如何分析和获取Global和SQL表的对应关系。 1. 基于SQL建模 如果InterSystems IRIS/Caché模型就是用SQL建模的,查找Global和SQL表的对应关系很简单:对象模型是基于SQL模型自动创建的,因此它们之间是一对一的关系。这是,在Caché里,编译出的Storage 类型为%Library.CacheStorage;在InterSystems IRIS里,编译出的Storage 类型为%Storage.Persistent。 可以执行SQL查询: SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= <schemaname> AND type='%Library.CacheStorage' 其中<schemaname>是SQL的Schema名称,如果Schema里有“_”,应将其去掉。Parent字段是SQL表对应的类名,DataLocation是保存数据的Global名称。而Global的第一个下标就是行号/Id字段。 例如使用DDL创建一个table: Create table Demo.Mytable(name varchar(20), notes varchar(100)) 通过上面的SQL查询,DataLocation为Demo.MytableD。那么Journal中所有对于Global为Demo.MytableD的操作就是对表Demo.Mytable的记录操作。例如^Demo.MytableD(123), 就是对行号/Id字段为123的Demo.Mytable记录到操作,从而可以通过SQL: SELECT name, notes from Demo.Mytable WHERE id = 123 获取这条变更的记录。 2. 基于对象建模 如果InterSystems IRIS/Caché模型是使用对象建模的,查找Global和SQL表的对应关系有时并不那么简单。例如以下描述患者及地址的简单对象模型: Class Demo.Address Extends %SerialObject { Property Type As %String; Property City As %String; Property Street As %String; Property RoomNo As %String; } Class Demo.Patient Extends %Persistent { Property Name As %String; Property Gender As %String; Property DOB As %Date; Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array"); } 因为患者可能有多个地址,因此Demo.Patient类用以列表类型(list)描述地址属性。其中地址Demo.Address对象模型是通过被引用的持久化对象来序列化的,此处引用它的持久化对象类就是Demo.Patient。Demo.Address类并没有独立的Global保存其数据,它的数据是保存在Demo.Patient的Global中的。 这个对象模型很容易理解,以对象方式在InterSystems IRIS/Caché里也很容易操作数据。但SQL的二维表无法表达这样稍微复杂一点的模型,因此需要将患者的地址投射为一张地址表,并用主外键将地址表和患者表的记录关联起来。 上面的患者对象模型中Addresses属性的SQLPROJECTION和STORAGEDEFAULT参数就是将属性Addresses投射为一张SQL表。 编译后,这个患者对象模型,在SQL上会投射出两张表:患者表:Demo.Patient地址表:Demo.Patient_Addresses注意:SQL表Demo.Patient_Addresses并不是由对象类Demo.Address投射而来,它是由对象类Patient的列表类型的属性Addresses投射而来。对象类Demo.Address是序列化类,它并不会投射SQL表。 执行SQL查询 SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= 'Demo' 将返回类似如下结果: SQLTable Class DataLocation Demo.Patient Demo.Patient ^Demo.PatientD Demo.Patient_Addresses Demo.Patient 注意:SQL表Demo.Patient_Addresses并没有对应的Global,因为它的数据是保存在Patient的Global里的。 这时可以使用以下SQL查询获取SQL表Demo.Patient_Addresses对应的Global和下标: SELECT CC.ID||'_'||CSD.Attribute as SQLTable, CS.parent as Class, CS.DataLocation, CSD.Structure, CSD.Subscript FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC, %Dictionary.CompiledStorageData CSD WHERE CS.parent = CC.Name AND CS.ID1 = CSD.parent AND CC.SqlSchemaName= 'Demo' AND CC.ID||CSD.Attribute in (select parent from %Dictionary.CompiledStorage where DataLocation is null) 它返回类似如下结果: SQLTable Class DataLocation Structure Subscript Demo.Patient_Addresses Demo.Patient ^Demo.PatientD subnode “Addresses” 这说明SQL表Demo.Patient_Addresses的数据放在Global ^Demo.PatientD的下标为"Addresses"的子节点下。所以对Global节点 ^Demo.PatientD(“Addresses”)的数据变更就是对SQL表Demo.Patient_Addresses的数据变更。 类似的,当创建对象模型的父子关系时,父子关系子方的数据可以保存在父方的Global中。如以下模型:患者模型 Class Demo.Patient Extends %Persistent { Property Name As %String; Property Gender As %String; Property DOB As %Date; Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array"); Relationship Encounters As Demo.Encounter [ Cardinality = children, Inverse = Patient ]; } 就诊模型,它和患者模型是父子关系 Class Demo.Encounter Extends %Persistent { Property EncounterNo As %String; Property VisitDate As %Date; Relationship Patient As Demo.Patient [ Cardinality = parent, Inverse = Encounters ]; } 执行SQL查询 SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= 'Demo' 将返回类似如下结果: SQLTable Class DataLocation Demo.Encounter Demo.Encounter {%%PARENT}(“Encounters”) Demo.Patient Demo.Patient ^Demo.PatientD Demo.Patient_Addresses Demo.PatientAddresses 这说明SQL表Demo.Encounter的数据放在Global ^Demo.PatientD的下标为" Encounters"的子节点下。所以对Global ^Demo.PatientD(“Encounters”)的数据变更就是对SQL表Demo.Encounter的数据变更。 3. 基于Global建模 直接基于Global建模并不常见。如果是直接基于Global建模的,可以在Global模型的基础上再建立对象模型,这样数据不仅可以使用多维数组方式操作,也可以通过对象和SQL方式操作。 这种情况下的对象模型,使用的Storage 类型在Caché里为%CacheSQLStorage,在InterSystems IRIS里为%Storage.SQL。 例如如下使用%CacheSQLStorage的Caché对象类Demo.Department: Class Demo.Department Extends %Persistent [ StorageStrategy = SQLStorage ] { Property Id As %Integer; Property Name As %String; Property Parent As Demo.Department; Index MyId On Id [ IdKey ]; Storage SQLStorage { <SQLMap name="DataMap"> <Data name="Id"> <Delimiter>"^"</Delimiter> <Node>"id"</Node> <Piece>1</Piece> </Data> <Data name="Name"> <Delimiter>"^"</Delimiter> <Node>"Name"</Node> <Piece>1</Piece> </Data> <Data name="Parent"> <Delimiter>"^"</Delimiter> <Node>"Parent"</Node> <Piece>1</Piece> </Data> <Global>^MyDepartment</Global> <RowIdSpec name="1"> <Field>Id</Field> </RowIdSpec> <Subscript name="1"> <Expression>{Id}</Expression> </Subscript> <Subscript name="2"> <Expression>"Dep"</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Demo.DepartmentS</StreamLocation> <Type>%CacheSQLStorage</Type> } } 对于这种使用%CacheSQLStorage或%Storage.SQL的对象类所投射出的SQL表,可以使用以下SQL查询获取SQL表对应的Global和下标: SELECT CC.SqlQualifiedNameQ as sqltable, CC.id as class, CSM._Global as DataLocation, CSM.Structure, CSMS.Name as subscript,CSMS.Expression FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC, %Dictionary.CompiledStorageSQLMap CSM, %Dictionary.CompiledStorageSQLMapSub CSMS WHERE CS.parent = CC.ID AND CS.ID1 = CSM.parent AND CSM.ID = CSMS.parent AND CSM.Type='data' AND CC.SqlSchemaName= <schemaname> 其中<schemaname>是SQL的Schema名称。它返回类似如下结果: SQLTable Class DataLocation Structure Subscript Expression Demo.Department Demo.Department ^MyDepartment 1 {Id} Demo.Department Demo.Department ^MyDepartment 2 “Dep” 说明SQL表Demo.Department的数据保存在^MyDepartment 中,并且放在2个下标下,第一维下标为Id字段,第二维下标为字符串常量"Dep"。 这时,可以通过^MyDepartment的第一维下标(字段Id)值,执行SQL语句获取变更的整条记录: SELECT * FROM Demo.Department WHERE id=? 使用%CacheSQLStorage/%Storage.SQL为Storage类型的InterSystems IRIS/Caché对象类,其Global模型可以任意灵活,而且不影响对象操作和SQL操作。但这也提高了将Global变更对应到SQL表的难度。 总结 通过上面的分析,如果要从InterSystems IRIS/Caché中通过SQL方式分析数据变更,需要先了解其建模方式,分析Global对应SQL表的关系。可以建立一张SQL表,存储分析得到的Global及下标和SQL表对应关系。当通过Dejournal filter发现global数据变更时,查询该SQL表,将数据变更表达为对应SQL表和对应记录(RowID),从而使用SQL获取完整的变化记录。 其它注意事项:流类型的属性/字段,通常保存在名为S的Global内,因此这些Global的数据更新也应该捕获并转换为对应SQL表的数据变更记录。 CDC系列 更多的CDC选项实现,请参考: 1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能 2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC 3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系 4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
文章
Qiao Peng · 三月 10, 2022

多语言字符集系列文章-- 第三篇 IRIS对多语言字符集的支持和常见问题

3.1 InterSystems IRIS内码与多语言支持 3.1.1 InterSystems IRIS内码与字符集转换 InterSystems IRIS的内码是UTF-16,因此它支持Unicode多语言字符集。对于其它字符编码,例如UTF-8、GB18030、Big 5,它会自动进行转码。例如对于简体中文,它将GB18030输入数据转换为UTF-16,或者将UTF-16数据转换为GB18030输出。 因为GB18030兼容GB2312,所以InterSystems IRIS也支持GB2312。 注意:在第一篇介绍过,GB18030与GBK并不完全兼容,因此InterSystems IRIS理论上不支持GBK。 InterSystems IRIS如何做字符集编码系统间的转换?它使用2种方式: 对于可以通过算法转换的,例如UTF-8与UTF-16的相互转换,InterSystems IRIS会使用算法转换; 对于无法通过算法转换的,例如与UTF-16的相互转换,InterSystems IRIS会使用I/O转换表转换,它其实是两个映射关系表,一个用于特定字符集转UTF-16、另一个用于UTF-16转特定字符集。 注意,大家可能会注意到,GB18030的I/O转换表里并没有所有的GB18030编码,这是为什么呢?回顾一下第一篇关于GB18030的介绍,它提到了GB18030编码中一部分与Unicode编码非连续相关,而另一部分与Unicode编码连续相关。在InterSystems IRIS的GB18030的I/O转换表,其实只有与Unicode编码非连续相关的那部分编码,就是需要通过对照表关联的部分;而连续相关的那部分,是通过算法转换的,因此不在I/O转换表里。这么做的目的是降低把GB18030这么大的代码表全部加载到内存里的硬件成本。 3.1.2 字符集相关的命令、函数和方法 InterSystems IRIS提供了一系列与字符集相关的命令、函数和方法。它们可以帮助我们理解InterSystems IRIS的字符集处理逻辑、帮忙在字符集相关问题出现时进行排错。 这里以汉字为例介绍这些命令、函数和方法。汉字的UTF-16编码的16进制值是9451、GB18030的16进制值是E861。 ZZDUMP:查看变量16进制编码的命令 例如:我们看一下变量x的16进制值 这里,可以看到变量x保存的是汉字,它的16进制的值是9451。9451就是汉字的UTF-16(Unicode)16进制码。 $ZCONVERT($ZCVT):转码函数 如果需要通过代码控制不同字符集编码间的转换,可以使用$ZCVT函数。例如,我们把上面变量x的字符转码为GB18030编码: 这个例子中,传递给$ZCVT的第一个参数是变量x;第二个参数是“O”,意思是将x的字符编码转码为目标码;第三个参数是要转换的目标编码,“GB18030”。现在变量y的值就是汉字的GB18030编码。 同样,你可以把变量y的GB18030编码再转为IRIS内码UTF-16。这时,第二个参数要设置为“I”,意思是设置源编码;而第三个参数还是“GB18030”: 现在变量z仍是汉字的UTF-16编码。 $ASCII、$WASCII :将字符转为10进制UTF-16码 这两个系统函数将所有字符转为其10进制的UTF-16码。名字有点迷惑,它们并不是获得字符的ASCII码,当然对于ASCII字符,ASCII码和UTF-16码是一样的。 其中$ASCII可以将UCS基本平面的字符转为UTF-16,也就是双字节UTF-16编码。例如汉字的就是这样的: 但那些超过双字节UTF-16的汉字就需要用$WASCII来获取其UTF-16的值了。例如汉字“”,它的UTF-16编码是4字节的D85FDFF9,获取它的UTF-16值,就需要用$WASCII($WA)。当然,也可以全用$WASCII来获取所有字符的UTF-16编码。 $CHAR、$WCHAR: 将10进制UTF-16码转为字符 这两个系统函数将10进制的UTF-16码转为字符。例如: 同样,$CHAR可以转双字节的UTF-16;$WCHAR可以转双字节或四字节的UTF-16。 $ZHEX:将16进制数转10进制数、10进制数转16进制数 上面有些函数处理16进制数、一些处理10进制数,可以用函数$ZHEX做10进制和16进制数的转换。例如: USER>w $ZHEX("E861") 59489 大家可能对这个函数比较迷惑:只有一个参数,那么怎么知道它是10进制数还是16进制数呢?例如9451,既可以表达一个10进制数,也可以表达一个16进制数。$ZHEX是这么判断的:是以字符串传入的参数(加了双引号的)就是16进制,而以数字传入的参数(没加双引号的)就是10进制。因此会得到这样的结果: USER>w $ZHEX(9451) 24EB USER>w $ZHEX("9451") 37969 3.2 常见字符集相关问题 既然InterSystems IRIS支持GB18030-2005,那么还会有中文字符集相关问题吗?还是会有,因为InterSystems IRIS不仅是一个数据库,它的互操作功能会和各种数据源和数据目标连接,接收和发送各种编码的数据。如果数据源/数据目标所声明使用的字符集与其实际使用的字符集不同,或者未声明使用的字符集并且实际字符集和IRIS默认的字符集不符,就会造成问题。这也是绝大多数的InterSystems IRIS相关字符集问题的根源。 所以在InterSystems IRIS中遇到字符乱码问题时,首先应该看一下数据声明的字符集是什么,实际收到数据的字符集是什么。数据声明的字符集信息,可以看上一篇《各种技术对字符集使用的声明》的介绍,而实际收到数据的字符集可以使用Wireshark等工具检查。 下面列举一些常见的字符集相关的问题处理方式: 3.2.1 文件 对于正确编码的文件,InterSystems IRIS都可以正常处理。但如果文件声明的字符集编码与实际的编码不同时,可以使用$ZCVT进行转码。 如果在使用文件(File)或FTP适配器,这2个适配器都会CHARSET设置项,可以使用这个设置项做InterSystems IRIS内码(UTF-16)和真实需要的字符编码间自动做相互转换。 InterSystems IRIS提供了好几个字符文件的操作类:%Library.File、%Library.FileCharacterStream、%Stream.FileCharacter。在使用它们创建文件时,需要注意指明文字字符集,否则默认为ANSI,从而造成生僻字异常。 InterSystems IRIS不同的字符文件操作类,对于字符集的声明稍有差异,如下: 对于%Library.File,在执行Open方法时设置字符集,例如设置为UTF8 Set tFile = ##class(%File).%New("c:\temp\test.txt") Do tFile.Open("WSN:/IOTABLE=""UTF8""") 对于%Library.FileCharacterStream,设置其TranslateTable属性,或调用TranslateTableSet方法设置 Set tStream=##class(%FileCharacterStream).%New() Set tStream.Filename="c:\temp\test.txt" Set tStream.TranslateTable="UTF8" 对于%Stream.FileCharacter,设置其TranslateTable属性,或调用TranslateTableSet方法设置 Set tStream = ##class(%Stream.FileCharacter).%New() Set tST=tStream.LinkToFile("C:\temp\test.txt") Set tStream.TranslateTable="UTF8" 另外,还要考虑BOM问题,有些文本编辑器打开没有BOM的UTF-8文件时会显示乱码、而另外一些有BOM反而显示乱码。 对于BOM,%Library.File无法在文件头插入BOM,%Library.FileCharacterStream、%Stream.FileCharacter可以通过设置其BOM属性,例如设置字符集为UTF8,且设置BOM为UTF8的EF BB BF(10进制239 187 191): Set tStream = ##class(%Stream.FileCharacter).%New() Set st= tStream.LinkToFile("C:\temp\test.txt") Set tStream.TranslateTable="UTF8" Set tStream.BOM=$char(239,187,191) Do tStream.Write($C(8224)) Do tStream.%Save() 从性能和功能角度,推荐使用%Stream.FileCharacter和%Library.FileCharacterStream,而不是%Library.File。 3.2.2 数据库 通过InterSystems IRIS连接到第三方数据库进行查询或更新数据操作而出现乱码是比较典型的字符集问题。 当遇到问题时,尤其是Oracle数据库时,首先检查一下数据源的内码设置。如果是其内码设置问题,那么通常需要通过$ZCVT来转码。 如果不是内码设置问题,查一下InterSystems IRIS使用什么方式连接到对方数据库:ODBC还是JDBC。如果是JDBC,看看连接字符串中的字符集设置是否正确;如果是ODBC,看看是不是生僻字乱码,如果是可能需要用$ZCVT转码,否则要检查ODBC驱动是否正确,尤其是是否在使用其ODBC3.5的驱动。 3.2.3 HTTP 遇到HTTP相关的字符乱码,首先查一下HTTP头Content-Type的参数charset设置。如果对方没有设置或设置不正确,且对方不能修稿,可以使用$ZCVT转码。 对于使用HTTP适配器的IRIS业务服务,可以通过其CHARSET设置项来配置字符集,并通过"FORCE CHARSET" 设置项强制跳过HTTP头Content-Type的参数charset设置。 3.2.4 SOAP/REST传递的XML字符流/字符串 首先检查下encoding属性的设置。如果它没有设置或设置错误,且不能修改,可以使用$ZCVT转码。 3.2.5 HL7 V2消息 HL7 V2是医疗行业常用的消息协议,InterSystems IRIS提供了大量的工具和特性以支持HL7 V2消息。 如果是HL7 V2传输中出现的中文乱码问题,首先查一下MSH-18的设置。如果数据源没有设置或设置错了,都可以使用InterSystems IRIS数据转换能力先将其修正为正确的值。当然有可能接收目标系统不按MSH-18设置的字符集解码数据,这时,可以按目标系统要求的字符集来编码数据,而忽略MSH-18。 InterSystems IRIS提供了很多工具,可以查看HL7 V2消息或文件的内容, 例如HL7查看器、消息追踪。InterSystems IRIS会按MSH-18设置的值进行数据的解码,当MSH-18值缺失时,默认值是Latin1。如果是因为MSH-18缺失而造成中文显示为乱码,且HL7 V2消息源无法修改时,可以考虑修改EnsLib.HL7.Util.IOFraming的DefCharEncoding(字符集编码默认值)为消息源使用的字符集。 注意,这种乱码情况不会影响HL7消息的接受接收和发送,仅影响显示。 3.2.6 其它 可能还会碰到一些的中文乱码其实是显示问题,尤其是那些仅生僻字显示有问题的情况。 出现这类显示问题的原因是并不是所有的操作系统和IT工具都支持完整的汉字字符集或汉字字形。 例如,常见的字符终端工具仅支持GB2312,所以对GB2312字符集之外的汉字就会显示为一个特定的符号,看起来就像乱码。 而MacOS的Safari浏览器、Pages文稿和很多应用都不能显示一些GB18030字符集的生僻字,例如: 这种情况下,数据本身没有问题,只是显示不正常而已,通常不需要担心。 这就是InterSystems IRIS多语言字符集的支持的主要内容内容。后面我会持续将客户遇到的与字符集相关的典型问题持续更新到文章的末尾,供大家参考。 附录1: 列表类型的中文数据显示乱码? 最近一个客户问了一个中文显示乱码问题。经过查看,发现乱码字段/属性的类型是list of %String,而且使用逻辑模式查看数据。换成ODBC模式或显示模式就没有问题了。原因是列表元素间是有特殊控制字符的,不同显示模式处理列表类型的数据方式不同,详见 显示模式 。对于列表类型的属性/字段,建议通过STORAGEDEFAULT="array" 将其映射为SQL子表,从而更容易通过SQL查看和操作数据,同时对象和global的访问不产生任何影响。例如: Property MyList as list of %String (STORAGEDEFAULT="array");
文章
Lilian Huang · 1 hr 前

利用 FHIR 简化健康数据集成

数字健康解决方案提供者面临的压力越来越大,他们不仅要集成复杂的健康数据系统,还要确保可扩缩性、安全性和符合 HL7 FHIR 等标准。 Fast Healthcare Interoperability Resources (FHIR) 提供了一个标准化框架,使不同的健康 IT 系统能够毫不费力地进行通信,彻底改变了健康数据的交换方式。 但是,仅仅遵循 FHIR 标准并不足以应对健康数据集成错综复杂的问题。 解决方案合作伙伴必须利用 FHIR 代理、装饰和仓库等先进的架构组件来构建可扩缩的高效解决方案。 无论是本地部署、在公共云中,还是作为 InterSystems 管理的基于云的服务,InterSystems 提供为您的健康数据实现 FHIR 所需的所有必要功能。 InterSystems IRIS for Health 是一个全面的数字健康开发平台,提供处理 FHIR 数据和开发 FHIR 应用程序所需的所有要素。 InterSystems 平台包括可靠、高效的数据管理栈,并无缝实现 FHIR,使开发者能够创建可扩缩、可互操作的医疗保健解决方案。 为了支持这些功能,InterSystems IRIS for Health 包括下列一整套强大的功能,不仅可以简化 FHIR 集成,还能最大限度地提高互操作性: FHIR 服务器 – 一个开箱即用的完全兼容 FHIR 的服务器,也可以作为 FHIR 装饰的前端。 此服务器可以接受、处理 FHIR 请求,并将其转换为底层系统使用的旧版格式,或反之。 批量 FHIR – 一组独特的功能,可以导入和导出大型 FHIR 数据集,用于研究、分析、数据迁移和其他用途。 批量 FHIR 让您可以在一个高效的请求中轻松检索主要 FHIR 资源,并管理多个系统和位置中的大型数据集。 FHIR 转换 – 一组独特的工具,可以让您在 FHIR 资源和旧版数据格式(例如,HL7 v2、CDA、自定义模式)之间无缝转换。 该平台可以将这些旧版格式实时映射到 FHIR 中,从而高效地检索和更新数据。 FHIR SQL Builder – 一个供分析师和开发者使用的独特工具,他们可以使用 ANSI SQL、Power BI 或 Tableau 等熟悉的工具安全地实时查询 FHIR 数据。 由于采用复杂的有向图进行编码,FHIR 无法使用标准 SQL 进行查询。 使用 FHIR SQL Builder,您可以基于 FHIR 仓库本身创建自定义 SQL 架构,无需将数据移动到额外的 SQL 仓库。 数据规一化和访问 – 支持数据规一化,以便从旧版系统中检索到的数据具有良好的结构并能够以 FHIR 格式进行访问。 此功能对于确保汇总并一致地显示来自不同系统的数据至关重要。 FHIR 对象模型 – 使用支持代码补全和 IntelliSense 的 FHIR 模型类自定义代码编程。 FHIR 组件、架构和模式 FHIR 提供了一个灵活的可扩缩框架来实现医疗保健数据的互操作性。 为了有效利用 FHIR,我们需要了解实现数据集成和数据交换所需的关键组件、架构和模式。 概括来讲,FHIR 的功能分为以下几个组成部分: FHIR 代理 充当多路由中介,简化了各种系统之间健康数据的流动和交换。 它通过管理事务、协调不同的系统并确保高效安全地移动数据,实现了无缝的互操作性。 对于数字健康解决方案合作伙伴,FHIR 代理充当“交换所”的角色,简化了数据交换过程,这让他们可以更轻松地在复杂的生态系统中集成和扩缩应用程序,无需从数据库中额外检索 FHIR 数据。 FHIR 装饰充当单一接口,可以降低底层非 FHIR 数据库的复杂性,使开发者能够专注于应用程序功能,而不是低层次的数据管理。 装饰立于非 FHIR 系统“之前”,因此基于 FHIR 的操作能够应用于该系统。 FHIR 仓库提供了一个集中式数据存储库,用于以 FHIR 格式原生管理和提供健康数据,并确保数据的完整性、安全性和访问控制。 仓库的优点是更容易集成和管理,以及更好的性能和更高效的查询和更新。 同时,这些 FHIR 组件还使开发者能够创建灵活、高性能、安全的医疗保健应用程序,在提高患者治疗效果的同时,还可以减少开发和维护开销。 InterSystems FHIR 栈为 FHIR 实现者提供了一种选择,他们可以利用强大的数据集成和管理专业知识为所有主要的 FHIR 架构模式提供支持,这些模式会以不同的方式组合前述的 FHIR 组件。 InterSystems 提供了一整套全面的 FHIR 功能,这不仅有助于遵守 FHIR 标准,还会增强不同系统之间的数据互操作性。 通过将技术能力与深厚的行业知识相结合,InterSystems 帮助开发者应对 FHIR 应用的复杂性,并实现最适合其需求的 FHIR 解决方案。 安全性是医疗保健数据管理的一个关键因素,InterSystems 提供了强大的工具来确保其 FHIR 接口的安全。 这包括基于角色的访问控制 (RBAC)、对 FHIR 的 OAuth2 支持,以及审核日志记录,以确保符合 HIPAA 等医疗保健法规。 我们来检验一下这些 FHIR 组件如何在 InterSystems 软件中协同工作,帮助您选择最符合您需求的架构模式。 FHIR 代理 FHIR 代理是一个使用 FHIR 标准的多路由中介,它能够促进医疗保健数据的交换。 它充当不同健康信息系统之间的连接器,使它们能够通过转换和路由 FHIR 资源进行有效通信。 在多个系统(如电子健康记录 (EHR)、临床应用程序和患者管理系统)需要无缝共享数据,同时仍需遵守 FHIR 标准的环境中,FHIR 代理必不可少。 InterSystems FHIR 代理功能为数据转换、验证和聚合提供了强大的工具,这些功能共同构筑了 FHIR 架构的基石。 这可以简化基于 FHIR 的解决方案的实现,而这些解决方案可以应对集成多个旧版系统之类的特定挑战。 例如,医院网络可能会整合各种 EHR 系统中的患者数据,而 InterSystems FHIR 代理可以聚合这些系统中的信息,将其标准化为 FHIR 格式并以统一的视图呈现。 然后,临床医生可以实时访问全面的患者信息,从而改善医护协调,降低出错风险。 此外,FHIR 代理还可以促进人口健康管理的安全、可扩缩的数据共享,使医疗保健提供者能够分析趋势,改善不同人群的患者的治疗效果(例如,心脏病、戒烟和儿童肥胖症)。 InterSystems SDA(摘要文档架构)数据模型旨在确保更加高效地将旧版医疗保健数据格式转换为现代标准(如 FHIR)。 SDA 为各种旧版医疗保健数据格式(如 HL7 v2、CDA(临床文档架构)或自定义平面文件格式)提供了统一的数据表示。 这种中间格式弥合了高度结构化的旧版系统与更加模块化、更灵活的 FHIR 结构之间的差距,并将作为 FHIR 代理解决方案的一部分。 SDA 还充当抽象层,将不同来源的数据标准化为通用格式。 这种抽象降低了将每种格式直接转换为 FHIR 的复杂性,因为 SDA 提供了一种规一化的结构。 数据转换为 SDA 格式后,即可在多个系统中重复使用。 对于每种旧版格式,只需进行一次 SDA 格式转换即可。 通过 SDA,数据可以导出为各种现代标准,包括 FHIR,从而减少了多次点对点转换的需求。 InterSystems 提供内置的工具和连接器,可以让您轻松地从旧版格式转换为 SDA 以及从 SDA 转换为 FHIR。 这包括预定义的映射、解析器和转换逻辑。 InterSystems 还支持自定义 FHIR 配置文件,可以将 SDA 数据转换为满足特定组织或监管要求的 FHIR 配置文件。 FHIR 装饰 FHIR 装饰是医疗保健系统中使用的一种架构模式,可以在现有的不兼容 FHIR 的系统之上提供兼容 FHIR 的接口。 它充当实现接口,以标准化的 FHIR 格式公开来自旧版非 FHIR 系统的数据和服务,从而实现与现代医疗保健应用程序的互操作性,而无需对底层旧版系统进行重大更改。 与协调多个系统的 FHIR 代理不同,FHIR 装饰立于非 FHIR 系统“之前”。 许多医疗保健系统都基于早期标准构建,如 HL7 v2、CDA(临床文档架构)或与 FHIR 不兼容的自定义数据格式。 FHIR 装饰通过将旧版格式的数据按需转换为 FHIR,提供了一种满足现代互操作性标准,并与电子健康记录 (EHR) 系统、健康信息交换 (HIE) 和患者应用等新应用程序相集成的解决方案。 通过 InterSystems 和 FHIR 实现客户成功 以色列的一家健康维护组织 Leumit Health Services 试图改善付款人与服务提供者之间的数据共享,使其成员更容易获得医疗护理。 通过与 HL7 FHIR 实现方面的当地专家和当地医疗中心合作,Leumit 开发出一种通过 FHIR 装饰集成其各个系统的解决方案。 此解决方案可以自动登记患者:通过 InterSystems IRIS for Health,立即现场确定是否有资格共享基于 FHIR 的数据。 FHIR 装饰的主要特征 实时数据转换 – FHIR 装饰可以实时转换数据,在旧版系统的原生格式与 FHIR 资源之间转换请求和响应。 不干扰现有系统 – 底层系统继续像往常一样运行,而装饰会处理 FHIR 交互,最大限度地减少对旧版基础架构进行代价高昂的破坏性更改的需求。 逐步实现现代化 – FHIR 装饰可以让组织公开兼容 FHIR 的 API 供外部使用,逐步实现现代化,而不必一步到位地改革旧版系统。 互操作性 – 通过将旧版格式转换为 FHIR,FHIR 装饰可以与其他需要兼容 FHIR 的医疗保健系统、应用程序和平台实现互操作性。 InterSystems IRIS for Health 提供了一套理想的工具和技术来实现 FHIR 装饰,因为它原生支持 FHIR 和 FHIR 数据转换。 InterSystems IRIS for Health 支持使用自定义 FHIR 配置文件和扩展,使组织能够根据其特定需求调整 FHIR 装饰。 这种灵活性使 FHIR 装饰能够满足地区或组织的数据交换要求,同时遵守 FHIR 标准。 FHIR 仓库 与 FHIR 装饰相比,FHIR 仓库提供了一种更方便、更高效的医疗保健数据管理方式。 虽然这两种方式都旨在提供互操作性并促进 FHIR 的使用,但 FHIR 仓库在数据管理、性能和易于集成方面具有许多优势。 FHIR 仓库以 FHIR 格式原生存储、管理和展示医疗保健数据,提供了一个可以高效查询和更新数据的集中式平台。 这与 FHIR 装饰形成鲜明对比,后者用作旧版系统的前端,在非 FHIR 格式与 FHIR 格式之间实时转换。 InterSystems FHIR 仓库经过专门设计,支持以 FHIR 格式存储和管理数据,无需实时转换数据。 通过原生存储 FHIR 资源,仓库可以更高效地处理复杂的 FHIR 查询和更新。 无需中间映射,直接对 FHIR 仓库进行查询,这对于复杂搜索特别有用,例如跨多个 FHIR 资源(如患者、病情、观察)的患者记录查询。 所有数据都以 FHIR 格式存储在一个地方。 这提高了数据存储和访问的一致性、效率和可靠性。 InterSystems FHIR 仓库可以随着医疗保健组织的不断发展而高效扩缩并处理越来越多的数据。 由于仓库存储了预转换的 FHIR 数据,在处理来自多个系统的并发请求时,系统会进行性能优化。 InterSystems 具有一个可扩缩性实验室,用于对 FHIR 的性能进行基准测试。 该实验室定期运行一整套 FHIR 基准测试,结果显示在复杂的 FHIR 搜索查询方面取得了显著的进步。 简单的仓库搜索每秒可以检索超过 160,000 个 FHIR 资源,在要求更高的情况下具有类似的性能 (Jamieson & Banand, 2024)。¹ InterSystems 提供了一个开箱即用的完全兼容 FHIR 的仓库。 这使医疗保健机构不必进行复杂的设置即可快速部署符合最新 FHIR 标准的 FHIR 仓库。 此栈支持所有主要的 FHIR 交互,包括资源创建、检索、更新和删除。 InterSystems 确保其 FHIR 仓库与不断发展的 FHIR 标准保持一致,提供对最新的 FHIR 资源和功能支持。 这可以确保与其他基于 FHIR 的系统兼容,并适应不断发展的医疗保健标准。 利用 InterSystems IRIS 扩展 FHIR 仓库的功能 内置的 FHIR 仓库与 InterSystems IRIS for Health 数据平台原生集成,可以实现与其他医疗保健系统和应用程序的无缝交互。 这使摄取、存储和检索 FHIR 资源变得更加容易,不会带来额外的复杂性。 InterSystems IRIS for Health 包含一个多模型数据库,并支持高级分析、AI 和机器学习模型。 此平台的 FHIR 仓库可以用作构建分析解决方案的基础,分析解决方案能够从结构化和规一化的医疗保健数据中提取信息。 InterSystems 独特的 FHIR SQL Builder 工具使开发者能够以关系格式“投射”FHIR 资源,从而轻松使用 ANSI SQL 或 BI 工具进行分析。 由于此平台是一个真正的多模型数据库,它可以实时进行这些投射,分析用户始终具有最新的信息,无需在数据仓库中复制其数据。 InterSystems IRIS for Health 以 FHIR 格式存储和查询数据,使组织能够应用人口健康分析、预测患者治疗效果,以及优化临床操作。 为什么选择 InterSystems FHIR 解决方案 无论您是构建 FHIR 代理、FHIR 装饰还是 FHIR 仓库,技术栈的选择都会对您的成功产生重大影响。 以下是 InterSystems FHIR Stack 应当成为您的首选的原因: 全面、可扩缩的 FHIR 支持 – InterSystems 为所有版本的最新 FHIR 标准提供全面的支持。 InterSystems IRIS for Health 拥有处理大量临床数据的可靠记录, 专为可扩缩性而设计。 无论您是开发简单的 FHIR 代理还是复杂的 FHIR 仓库,InterSystems 都可以确保即使在高容量环境中也可以进行高效扩缩,而不会影响性能。 我们独特的 InterSystems Bulk FHIR Coordinator 可以让您从支持批量 FHIR 的其他 FHIR 服务器和 EMR 进行批量导出,从而可以在一个地方轻松管理您的所有 FHIR 数据。 与现有系统无缝集成 – 医疗保健 IT 面临的一个最大挑战就是将新解决方案与旧版系统集成在一起。 InterSystems 的 FHIR Stack 在基于 FHIR 的新型应用程序与较早的 HL7 v2、HL7 v3 和 CDA 标准之间提供了无缝衔接。 这种互操作性可以确保在贵组织的 IT 环境中持续通信,而无需调整现有的基础架构,这使其成为 FHIR 装饰和我们独特的 FHIR 转换服务的理想选择。 经过验证的性能和可靠性 – 在医疗保健领域,可靠性不容商议。 InterSystems 一直以提供高可用性和低延迟的企业级性能而闻名。 FHIR Stack 基于 InterSystems IRIS for Health 构建,是专门针对医疗保健工作负载而设计的数据平台。 无论您是管理 FHIR 仓库还是充当 FHIR 代理,它都可以确保一致的正常运行时间和高效的实时数据交换。 高级数据管理和安全 – 数据安全和患者隐私在医疗保健领域至关重要。 InterSystems FHIR Stack 提供了强大的内置安全功能来保护敏感的医疗保健数据。 它完全符合 HIPAA 和其他全球标准,提供基于角色的访问控制、审核日志和加密功能。 对于构建 FHIR 仓库的组织来说,符合这些标准意味着可以放心地存储和交换大型数据集。 广泛的开发和自定义工具 – InterSystems 提供全面的开发环境,包括 API、SDK 和 FHIR SQL Builder,可以帮助您根据特定需求自定义和扩展 FHIR 解决方案。 无论您需要轻量级 FHIR 代理还是功能丰富的 FHIR 仓库,我们的工具和强大的支持服务都可以实现快速定制,加快上市速度。 卓越的供应商支持和生态系统 – InterSystems 以其出色的客户支持而闻名,其中包括全天候获取技术资源和广泛的开发者社区。 我们强大的合作伙伴和解决方案生态系统确保您在工作中永远不会孤单。 无论您是要就 FHIR 装饰的最佳做法进行咨询,还是要为您的 FHIR 仓库进行技术故障排除,都可以随时获取帮助。 更多关于此主题的文章: FHIR-HL7v2-SQL-Demo 我的 FHIR 使用经验 iOS、FHIR 和 IRIS for Health fhir-integratedml-example 概述 Iris FHIR Python 策略 一个使用 Python 编写的 FHIR 客户端的简单示例 一个使用 C# 编写的 FHIR 客户端的简单示例 一个使用 Java 编写的 FHIR 客户端的简单示例 使用嵌入式 Python 自定义 FHIR 仓库 FHIR 环境设置指南 来源:利用 FHIR 简化健康数据集成
文章
Lele Yang · 三月 31, 2023

Web Gateway系列(5)配置Web Gateway使用SSL/TLS连接到IRIS

《WebGateway系列(4): 配置HTTPS访问IRIS的Web服务》中介绍了在Web服务器中配置SSL/TLS以实现从客户端浏览器到Web服务器之间的安全连接,从Web服务器到IRIS之间是否也可以通过配置SSL/TLS建立起安全连接呢?尤其是在Web服务器与IRIS没有安装在同一台Server上的情况下,这段连接的安全性也是需要考虑的。答案是肯定的,接下来我们就来介绍下配置Web Gateway使用SSL/TLS连接到IRIS的基本步骤。 1.首先,我们先准备一下所需要的证书。通讯的双方为Web Gateway 和 IRIS Super Server, 双方都需要准备好各自的证书和key。IRIS自带的Public Key Infrastructure(PKI)功能内置了OpenSSL,可以用来生成服务器端及客户端的证书和key。在使用此功能时,IRIS可以同时作为CA Server和CA Client,作为CA Server时可以生成自签名的证书,可以批准CA Client的证书申请并将证书下发给CA Client。 1)配置本地证书颁发机构服务器,生成sever端的证书和key。 2)配置本地证书颁发机构客户端,如下 3)将证书签名请求提交到证书颁发机构服务器 4)进程未决证书签名请求 发放证书。 至此,Client以及Server端证书和key都已准备完成。 5) 从证书发放机构服务器获取证书。 以下证书和key将用于Web Gateway, /intersystems/irishealth/mgr/cac.cer /intersystems/irishealth/mgr/cac.key 以下证书和key将用于IRIS Super Server /intersystems/irishealth/dev/CAcerts/cas.cer /intersystems/irishealth/dev/CAcerts/cas.key 当然也可以去申请商用的证书,也可以不使用PKI直接使用OpenSSL自己去生成。 2. 配置SSL/TLS, 名为%SuperServer 3. Enable Superserver SSL/TLS Support, 4. 在Web Server中配置Web Gateway。 本示例中所使用的Web Server为Apache2.4.6,操作系统为Redhat7.9。注意以下Web Gateway管理页面打开端口为默认的80。另外,上面生成好的证书拷贝至了/tmp/下。 对应的CSP.ini中内容如下, [IRISHEALTH] Ip_Address=localhost TCP_Port=1972 Username=CSPSystem Password=]]]c3lz Minimum_Server_Connections=3 Maximum_Session_Connections=6 Connection_Security_Level=10 Product=2 SSLCC_Protocol=8@ SSLCC_Key_Type=2 SSLCC_Cipher_Suites=ALL:!aNULL:!eNULL:!EXP:!SSLv2 Env_Parameters=EV6 SSLCC_Certificate_File=/tmp/cac.cer SSLCC_Certificate_Key_File=/tmp/cac.key SSLCC_CA_Certificate_File=/tmp/cas.cer SSLCC_Private_Key_Password=]]]MTIz SSLCC_Verify_Peer=1 5. Web Gateway中Test Connection, 报错Server Unavailable。 CSP.log报错如下, >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: -1; Gateway-PID: 4315; Gateway-TID: 139634317305600; Connection-No: 0; Server: IRISHEALTH; InterSystems IRIS-PID: 0; Request-ID: 249b IRISCONNECT : Error Connecting to InterSystems IRIS : Unable to read SSL configuration Cannot read SSL certificate file: /tmp/cac.cer >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: 0; Gateway-PID: 4315; Gateway-TID: 139634317305600 Information: Terminate Connection Connection closed by Gateway: Connection-No=0:0; Server=IRISHEALTH; InterSystems IRIS PID=0; Context=205; >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: 0; Gateway-PID: 4315; Gateway-TID: 139634317305600; Connection-No: ; Request-ID: 249b; Session-ID: uoyakptQAD; Remote-Addr: ; Page: GET /csp/bin/RunTime/Module.cxw Diagnostic Failed to connect to 'IRISHEALTH' - Reason: -201 (SSL Configuration error) (No Retry) 解决办法, 将证书和key文件放置在Web Gateway安装路径下之后问题解决。 SSLCC_Certificate_File=/opt/webgateway/cac.cer SSLCC_Certificate_Key_File=/opt/webgateway/cac.key SSLCC_CA_Certificate_File=/opt/webgateway/cas.cer [root@BJSRHELSUP webgateway]# ll total 16 drwxr-xr-x. 2 root root 23 Sep 17 2021 apache drwxr-xr-x. 2 root root 4096 Sep 17 2021 bin -rwxr-xr-x 1 root root 1233 Mar 29 14:48 cac.cer -rwxr-xr-x 1 root root 1834 Mar 29 14:49 cac.key -rwxr-xr-x 1 root root 1164 Mar 29 14:49 cas.cer drwxrwxr-x. 2 apache root 56 Aug 30 2022 conf drwxrwxr-x. 2 apache root 57 Nov 4 2021 logs drwx------. 2 apache root 6 Mar 29 14:41 temp drwxr-xr-x. 2 root root 20 Sep 17 2021 util 6. Web Gateway中再次Test Connection,成功。 参考文档, InterSystems Public Key Infrastructure Configuring the Web Gateway to Connect to InterSystems IRIS Using TLS
文章
Hao Ma · 四月 18, 2021

IRIS Docker的安装

IRIS相比Caché在部署上的一个进步是支持docker。即便不是云部署, 使用docker也带来非常多的便利。 尤其是在开发测试环节,由于docker的使用更便捷,除非要模拟客户的环境或者做规定的性能测试,我在测试中基本已经不再使用本机的实例或者虚机。IRIS的联机文档有[详细的IRIS docker安装使用指导](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_compose),本文只是一个简单的,快速上手的**在测试环境**安装IRIS docker的简单步骤,尤其适合初学者。 注意Windows上docker可能会遇到这样那样的问题,因此通常还是推荐在Linux或者Mac OS上使用。正式的生产环境的IRIS docker container也是不支持Windows系统的。 > Referrence - [First Look: InterSystems Products in Docker Containers](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers) - [Running an InterSystems IRIS Container: Docker Run ExamplesRunning an InterSystems IRIS Container: Docker Run Examples](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_dockerrun) ##1. 在操作系统上安装Docker环境 [Docker官方文档的安装步骤](https://docs.docker.com/engine/install/)非常清晰,我按照上面的步骤在MAC和CentOS上安装docker从来没有出现过问题。恰恰是这个文档中没有的Redhat上的安装,过程中曾碰到过几个问题,在网上搜索了答案,也不算困难。 简单的复述一下步骤:root用户的最简单安装,没有权限问题, 没有docker网络修改等等: 1. 安装yum-util, 用于添加yum源,如果您的系统中已经有了yum-utils包这步可以省略 sudo yum install -y yum-utils 2. 添加docker的Repo到yum源并确认 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum repolist 3. 安装3个docker组件 sudo yum install docker-ce docker-ce-cli containerd.io 4. 启动Docker sudo systemctl start docker 5. 确认安装成功。'docker run'命令会去本地的库里找'hello-world',没有找到就去网上下一个"images",然后创建一个docker容器给你使用。 sudo docker run hello-world 安装结束您想要到注册一个账户,用来下载上传docker image。 下载命令使用'docker pull', 比如 ``` docker pull nginx ``` ## 2. 下载IRIS Docker image 在线文档[Container Images Available from InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry)中介绍了网站上可以下载的IRIS images的列表,其中community版本不需要license,其他的版本需要从InterSystems处获得IRIS docker版的专用license. 下面是登录并下载iris docker image的记录。从网页登录,您会得到docker的登录密码"使用的密码"jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb"。 [root@centos7 ~]# docker login -u="hma" -p="jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb" containers.intersystems.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@centos7 ~]# docker pull containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 2020.3.0.304.0: Pulling from intersystems/iris-ml 5c939e3a4d10: Pull complete c63719cdbe7a: Pull complete 19a861ea6baf: Pull complete 651c9d2d6c4f: Pull complete d21839215a64: Pull complete 7995f836674b: Pull complete 841ee3aaa7aa: Pull complete 739c318c2223: Pull complete d76886412dda: Pull complete Digest: sha256:4c62690f4d0391d801d3ac157dc4abbf47ab3d8f6b46144288e0234e68f8f10e Status: Downloaded newer image for containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 [root@centos7 ~]# 另外,您也可以从InterSystems的技术支持网站下载iris docker的压缩包"iris*.tar.gz",然后使用"docker load"安装, 比如: CNMBPHMA:~ hma$ docker load -i iris-2020.4.0.524.0-docker.tar.gz ## 3. 创建并运行IRIS Container ###简单的办法 如果是只是简单的测试,可以直接运行,但如果不是community版本的docker, 您还需要把license拷贝到container内部。 比如下面的步骤 CNMBPHMA:~ hma$ docker run -d -i -p 52773:52773 -p 51773:51773 --name iris20204 intersystems/irishealth:2020.2.0.211.0 CNMBPHMA:~ hma$ docker cp iris.key iris20204:/usr/irissys/mgr/iris.key 需要注意的是,不同版本的超级端口可能不同,有些是1972,有些是51773。为了省事,您也许可以使用"-P"把所有container内部的端口都映射出来。 除了要拷贝license到container内部,在做测试的时候,您可能还要经常的使用"docker cp"把各种测试文件拷入container。而且,当查看和修改container内部文件的使用,还需要使用下面的命令进入container内部: CNMBPHMA:~ hma$ docker exec -it iris20204 /bin/sh 因此,如果是您需要一个经常使用的iris container环境,我还是建议您使用下面的方法。 ### IRIS Container使用外部存储 简单的说,下面的命令 - 使用"--volume"参数为container创建外部存储,将host上的"/root/data/dur"文件夹和container内部的"/dur"文件夹链接起来。(/root/data/dur文件夹要在host上手工创建,这只是一个示意,您可以使用任何可用的目录) - ISC_DATA_DIRECTORY环境设置会在创建iris container时在/dur文件夹下创建一个子目录”/dur/irisepy",所有IRIS运行的日志,客户配置,mgr目录下的用户数据都会保存在这个目录。因为"/dur"是外部存储,即使docker container被删除数据也不会丢失。这对container的重新创建或者iris升级都带来很大的方便。在线文档上对如果覆盖或者升级带有外部存储的iris container有详细的介绍。 - “key"参数定义了在IRIS container创建时会把"/dur/license"目录下的iris.key拷贝到iris安装目录的mgr下并激活。也就是说,在运行命令前, 您需要在host上在"/root/data/dur"目录下创建"license"子目录并将iris.key拷贝进去。 docker run --name irisepy --init -d\ -p 9091:1972 -p 9092:52773\ -v /root/data/dur:/dur\ --env ISC_DATA_DIRECTORY=/dur/irisepy \ containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 \ --key /dur/license/iris.key 希望您喜欢使用docker