在Cache数据库建表的时候,在定义字段长度的时候,长度设置为1000和长度设置为2000在存储一个长度为1000的值的时候占用的存储空间是否一致。是否在建表的时候建议把字段长度设置为MAXLEN=""
WinterCorp 性能测试报告摘要
- InterSystems的性能测试方法用来衡量 "许多运行状态下数据库应用的关键构件 "是有效的。
- 与AWS Aurora MySQL、MariaDB、Microsoft SQL Server、Oracle和PostgreSQL相比,InterSystems IRIS显示出 "巨大的性能优势"。
- InterSystems IRIS的插入速度是其他系统的1.7到9倍。InterSystems IRIS的数据速率是1.1到600倍。在插入率和查询率的组合上,没有其他系统在性能上能接近于InterSystems IRIS。
- InterSystems IRIS的效率是AWS Aurora MySQL的2.7到3.1倍,而且随着集群中节点数量的增加,效率优势也越来越大。
- 在整个三到五分钟的集群测试中,InterSystems IRIS插入的记录在插入后很快出现在查询中。
图1. 每vCPU每秒查询对比(InterSystems IRIS vs AWS Aurora MySQL,1-4 查询节点)
图2. 单节点插入/查询速度对比(InterSystems IRIS vs AWS Aurora MySQL vs MS SQL Server)
各位开发者社区的同学们,大家好!
10月24日晚,我们成功举办了“首届技术征文大赛线上分享会”,我们在这次活动中邀请了多位征文大赛的参赛同学分享技术心得,同期举办了多轮抽奖,以下是各个奖品的获奖名单,我们恭喜这些获奖者,同时提醒获奖者请务必通过二维码登记奖品领取信息(如已登记请忽视)。
谁没有 Library.SQLCatalogPriv
日常工作中,我们使用xml 应该是比较多的,早期的ensemble或者cache,对JSON的支持不是很好,但是对xml支持比较好。因此早期的接口方式中,webservice+xml的方式很常用。而对象导出为xml最简单的方式就是类继承%XML.Adaptor。继承该类后,就可以使用很多xml的特性,以满足各种需求。虽然看不到对象转为xml的具体实现,但是配置了参数,就可以实现更多的效果。那么想自定义一些参数呢?如果有人打开过它的定义,可以看到类上面有个 “PropertyClass = %XML.PropertyParameters”,那么我们其实在需要xml参数的同时,又要自定义参数,就可以自己写个属性类,继承于%XML.PropertyParameters。
这里,我姑且定义一个类,用于说明使用场景。
Class TEST.PropertyParameters Extends %XML.PropertyParameters [ ProcedureBlock ]
{
/// 敏感信息过滤
Parameter SENSITIVEINFOCTRL As STRING [ Constraint = ",*", Flags = ENUM ];
各位开发者社区的同学们,大家好!
我们的🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)已经结束,此次大赛收到了来自20名参赛者的30篇参赛文章,感谢大家的积极参与!
以下是获奖名单!
当我们使用IRIS时,我们通常有能力快速的部署一个现成使用的BI基础模块(数据、分析立方体和IRIS BI仪表盘)。当我们开始使用Adaptive Analytics时,我们通常希望有同样的功能。Adaptive Analytics拥有我们需要的所有工具。文档中包含了对如何使用开放的网络API的描述。用户界面和引擎之间的所有交互也都是通过内部的Web API发生的,并且可以被发射出来。
有必要将这两个过程自动化:在容器中部署Adaptive Analytics和直接部署到服务器系统。为此,最简单的方法是使用bash脚本来处理API。我们唯一需要的第三方应用程序是一个名为jq的JSON文件解析器。你可以使用以下命令来安装它:
apt update
apt install -y jq
首先,我们需要登录以获得一个API访问令牌。这个令牌也适用于引擎本身的方法。我们必须将访问令牌保存在一个变量中,因为现在我们几乎在每个请求中都需要它。对于一个标准的登录和密码admin/admin,该命令将看起来像这样:
TOKEN=$(curl -u admin:admin --location --request GET 'http ://localhost:10500/default/auth')开发者社区的同学们,1024快乐!
今晚19:30,我们将通过“InterSystems首届技术征文大赛线上分享会”发布获奖名单、进行征文作品分享&点评、探讨热门话题,同期还将举办多轮抽奖!欢迎参会,锁定#腾讯会议
第二十五章 CSP Session 管理 - 选择策略时的注意事项
组的注意事项
本节包含创建身份验证组时要考虑的一些要点。
TrakCare Lab是TrakCare产品中,属于检验科专用的系统,也就是LIS(Laboratory Information System),LIS在实验室中主要处理检验科以下的作业:标本签收、采血管卷标打印、检验仪器联机、仪器结果接收、仪器数据判读、报告验证、危险值通知与警示等诸多作业,而TrakCare Lab也同时将各流程间的运作,串联得相当规律且正确,使得医检师们得以有条不紊的工作。
检验报告核发的正确性在于一开始的标本采集及采血管的正确使用,若一开始便贴错病患或是用错采血管,不仅会让检验报告张冠李戴外,错误的采血管亦会让检验数据有所偏差,导致医嘱错误,进而发生病安事件,故标本正确采集的重要性可想而知。
门诊病患大部份是直接到检验科采检,在专业医检师及TrakCare Lab的签收检核机制及自动备管机的运用之下,出错率相当低。据临床上统计,贴错病患标签或采血管错误,来源多为住院或急诊,故降低检验科外部单位在采检上的错误率便成为开发护理站自动备管采检系统(NSAD)的主要目的。
我们试着延伸TrakCare Lab的检核机制至医院的护理站,在与客户商讨后,决定同时从硬件及软件两方面双管齐下:
硬件方面:
各位开发者社区的同学们,大家好!
经过一个多月的赛期,我们举办的🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)即将步入尾声!
InterSystems开发者社区(中文版)首届技术征文大赛的“征文&投票”环节将于12小时后结束(截至10月23日24:00)!
第二十四章 CSP Session 管理 - 认证架构
认证架构
安全上下文和粘性登录
应用程序在会话中运行。会话需要运行应用程序的安全上下文。安全上下文包含身份验证状态。
By-Sessions 和 By-ID Groups 有一个粘性登录,它会记住会话或组中使用的最后一个应用程序的安全上下文。如果组应用程序中的用户以其他用户身份登录,则会更新粘性登录。 (如果用户登录到未经身份验证的应用程序,则粘滞登录不会更新。)
在会话中跳转到应用程序时,会话会尝试使用适合目标应用程序的粘性登录。如果粘性登录与会话的当前安全上下文不匹配,并且应用程序可以接受粘性登录中的身份验证方法,则会话的安全上下文切换到粘性上下文中的安全上下文。
会话结束时,会话的粘性登录会丢失。当包含该组的任何应用程序的所有会话都结束时,该组的粘性登录将丢失。
初始登录后,组有一个关联的粘性登录对象,它在进入组的一个应用程序时尝试使用该对象。当组中的应用程序输入为 UnknownUser 时,粘性登录不会更新,因为这会将组中的所有其他应用程序移动到未经身份验证的安全上下文中。
如果粘性登录包含经过双重身份验证的用户,则该双重身份验证用于非双重身份验证应用程序,只要用户名身份验证在两个应用程序中匹配即可。
级联认证
CSP 服务器在尝试获取应用程序的身份验证信息时使用优先级。它尝试在以下每个事件中获取新的身份验证信息:
Cache锁的异常直接影响数据库进程运行,堆积的锁如果处理不及时会造成Cache性能异常,导致数据库访问受限或严重卡顿。本文主要以实例分析介绍Cache中常见锁的作用及其对应的处理方式,包括:系统锁、数据锁、Session锁、仪器锁、程序文件锁。其中数据锁异常需要及时处理。
查询Cache锁有两种方式:
1>可在System Management Protal的[Home]>[Locks]中查看;
2>可在terminal端使用Do ^LOCKTAB命令下查看,如下图所示,此方式适用于锁表量达到10000条以上,Protal页面HTTP响应超时无法显示锁表时使用。
一、【系统锁】
此类锁在数据库初次搭建时就存在,例如:
1>^%SYS("CSP","Daemon") ---调度锁
2>^TASKMGR ---守护进程
3>^DBACK ---数据库备份锁
4>^SYS("Task","TaskD",1058) ---执行系统任务锁
主要作用
操作系统: CentOS Linux release 7.9.2009 (Core)
1.查看数据相关信息
1)查看Caché数据库实例信息
[root@TestServer /]# ccontrol list
Configuration 'CACHE' (default)
directory: /opt/cache
versionid: 2016.2.3.907.11.20719
conf file: cache.cpf (SuperServer port = 1972, WebServer = 57772)
status: running, since Tue Oct 4 12:54:05 2022
state: ok
2)查看Caché数据库私有apache版本信息
1. 新的系统SQL业务服务/业务操作
接连SQL数据源和操作SQL数据目标是常见的集成业务场景。使用SQL适配器监控SQL数据源和操作SQL目标库时,我们需要开发自定义BS或BO,写不少代码。例如开发自定义SQL服务需要:
1. 开发响应消息类,用于承接SQL快照数据;
2. 开发自定义业务服务BS类,用于将SQL快照按字段赋值给对应的消息,并将消息发送给目标(业务流程或业务操作)。
而要开发自定义SQL操作,更麻烦些:
1. 开发请求和响应消息类,用于向BO传输数据和接收返回数据;
2. 开发自定义业务服务BO类,设置消息响应表,根据不同请求消息类型编写方法;
3. 在方法中根据请求消息数据拼写SQL语句;
4. 在方法中将SQL执行结果存入响应消息。
虽然很简单,但编程过程枯燥乏味。而且当修改SQL语句时,还要修改对应的消息类和BS/BO类。
从2021.2开始,InterSystems IRIS增加了2套系统通用SQL业务服务和SQL业务操作:
背景
作为集成平台厂商,在医院同其它系统联调的时候所做的事情中,多的不是开发代码而是查消息。我先演示一下目前我正在使用的IRIS查消息的方式:
例子1:
需要看【个人信息注册服务】
我只需要在框中输入【个人信息注册】回车
点击【查看消息】,显示的是消息里面的内容,如图所示:
点击【查看流程】,显示的是IRIS消息可视化的页面,如图所示:
例子2:
需要查询患者ID为【2874621】这患者在集成平台调用了哪些服务
我只需要选择下拉选择【患者ID】,然后输入【2874621】,回车
这个是我们以用户需求的角度直观的查询到指定的消息,IRIS也有这个功能—消息查看器,它是如何使用的呢?首先,我们得知道这条消息使用了哪些Production组件,其次我们需要了解这个消息使用的实体类的结构。比如同样查这个人的消息,我需要输入request.Body.PatientID=“2874621”,选择消息类。如果我需要查多个服务的我还需要多选消息类 …… 本文不是来介绍如何使用消息查看器的,各位大概知道就好。
程序分析与设计思路
原始消息查看器的使用
我们先使用IRIS自带的【消息查看器】查患者ID为【2874621】个人信息注册服务,如图所示:
cache数据库自身带有系统监控Portal界面,但需要运维人员定期主动查看才能获取监控信息。当系统故障发生时,容易出现由于没有及时获取故障信息而不能及时处理,从而导致造成的影响扩大。本文研究通过解析cache数据库控制台日志(cconsole.log)进行监控信息获取并主动推送微信或短信实现cache数据库主动实时监控。
cache数据库在运行时会将所有控制台消息包括一般消息、系统错误、某些操作系统错误和网络错误都会发送到控制台日志文件,通过操作员控制台工具从其他系统远程启动的作业的成功或失败等信息也会写入控制台日志,因此通过对控制台日志的解析即可获取所需要监控信息。具体步骤方法如下:
解析控制台日志
控制台日志默认存储在install-dir\mgr路径下。
根据cache版本不同,使用的读取方法也不同。对于cache2016版本以上,系统提供了EnsLib.SQL.Snapshot类,可以直接获取日志的行和列信息,非常方便。对于cache2010及以下版本则无此方法,需要使用%File文件读取方法。
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!
第二十二章 CSP Session 管理 - Private Pages
CSP 提供了私有页面的概念。只能从同一 CSP 会话中的另一个页面导航到私有页面。私有页面对于想要限制对某些页面的访问的应用程序很有用。
例如,假设有一个名为 private.csp 的私有页面(CSP 示例页面之一)。用户无法直接导航到 private.csp(例如,通过输入其 URL)。用户只能从另一个 CSP 页面中包含的链接导航到 private.csp。引用 CSP 页面中包含的链接不能是绝对 URL,以 http:// 开头。只有相对于引用页面的路径才被私有页面方法正确加密/标记。即:下面的前两个链接将相同的令牌传递给目标私有页面 test2.csp。
<A HREF='test2.csp'>Link to private page - relative path</A> <BR>
<A HREF='/csp/samples/test2.csp'>
Link to private page - full application path</A> <BR>
此链接的散列方式不同,无法访问。
<A HREF='http://myserver/csp/samples/test2.csp'>
Link to private page - absolute path</A>
在InterSystems IRIS医疗版里有一个文件压缩解压的适配器HS.Util.Zip.Adapter和对应的文件压缩解压业务操作HS.Util.Zip.Operations。集成产品可以使用它们进行文件的压缩和解压操作。这2个类的联机文档说明较少,这里介绍它们的使用方法。
1. 基础配置
InterSystems IRIS使用操作系统的压缩和解压缩能力,因此需要注册操作系统执行压缩解压的命令。
在管理门户的Health标签页下,选中配置注册(Configuration Registry):
在其中增加2个注册项目:
\ZipUtility\UnZipCommand 和\ZipUtility\ZipCommand,分别代表解压和压缩命令。适配器HS.Util.Zip.Adapter会检查这2个注册项并得到相应的命令。各个操作系统的命令并不一样,示例如下:
\ZipUtility\UnZipCommand 解压缩命令
| Windows | "c:\program files\7-zip\7z" x %1 -o. -r |
| 非Windows | unzip %1 -d . |
\ZipUtility\ZipCommand 压缩命令
| Windows | "c:\program files\7-zip\7z" a %1 . -r |
| 非Windows | zip -rm %1 . |
IRIS中实现zip文件的下载、解压及读取
0 前言
项目上做对账需求时,需要通过http方式下载第三方的对账的文件,是一个压缩文件,里边包含一个csv文件。
1 准备工作
1.1 安装解压缩软件
需要根据cache/iris服务器运行环境安装不同的解压缩软件。 本文是在windows环境下实现的,安装了WinRAR解压缩软件,安装目录为:”C:\Program Files\WinRAR“。
1.2 部署测试http服务器
部署一个web服务器,放一个zip文件。 本文在macOS系统中使用MAMP部署了一个简单的服务器,提供一个对外服务:http://192.168.1.107:8888/sss/Archive.zip
2 下载zip文件
主要思路: 通过http下载zip文件,然后另外到服务器上指定的文件夹下,并重命名。
代码
使用Cache的两个痛点问题:
一、Cache作为后关系型数据库,使用其提供M语言操作Global数据结构。可以达到极快的查询速度。M语言的set赋值和初始化没有区分,加之是弱类型,非常容易出现死循环,就算你是多年老手也一个不小心就踩坑。我就经历过改代码即使很小心还是出了死循环把数据库tmp撑满的事故。
二、M语言作为完备的编程语言,结合cache数据库操作数据实在是不要太方便。同时一个复杂的业务提交到数据库通过一个M逻辑全部处理完成,极大的减少了app和数据库交互次数。复杂业务的事务就是一方面,通过TSTART、TROLLBACK 、TCOMMIT,前台一次数据库交互后台就可能做了几十张表的更新操作。直接使用事务是容易,但是极易引入开放事务锁表(你自己就算很小心,也难保调别人接口别人事务不完善,而你又没检测事务层级),锁表之后结束进程导致数据回滚。
解决办法:
据我观察出现上面两个问题的原因,第一个是M语言弱类型和没单独的初始化命令导致,就算你是老手、工作细致也难以避免。第二个不是Cache特有的,通用关系库也有事务写的不完整的问题,事务问题对开发要求高或者从框架设计可以解决。
可以基于AOP切面设计一套死循环和开放事务避免体系,从架构上解决死循环难以发现引起的数据库崩溃和开放事务问题。
首先要求程序框架有统一的调入数据库入口,才方便在入口统一实现死循环监测和开放事务监测。
前言
自接触IRIS以来在医院之中使用最多的是其作为一个ESB集成引擎来使用,作为医院的集成平台+数据中心中的一环。但是其也可以进行CRUD作为前后端分离项目的后端使用:
文章目录
前言
文章目录
一、开发技术和工具
二、开发路径和相关代码
1.数据库
2.准备工作
3.开发接口的相关步骤
4.成果展示
总结
本文章将以一个简单的页面展示IRIS的相关CRUD操作:
是的,我计划使用IRIS重构Production页面,先展示一下我开发完的成果吧:
呃の好像是一毛一样,哈哈
一、开发技术和工具
工欲善其事,比先利其器:
后端:HealthConnect+Global
前端:vue
使用IRIS的%CSP.REST开发的Rest API接口,前端使用vue简单的把接口相关内容展示,可以编辑、新增组件,控制production启动、停止、更新检测状态。
二、开发路径和相关代码
1.数据库
首先,我们找到Production的相关表,分别是:Ens_Config.Item 和 Ens_Config.Production 如图所示:
所以代码的思路很明确了对Ens_Config.Item进行新增、删除、修改、查询操作对Ens_Config.Production进行查询操作。
2.准备工作
在正式开发之前我们得先做一些准备工作:比如开放网关
概述
现有Ensemble平台BS(服务)、BP(流程)、BO(操作)需对平台及开发语言有一定的了解才能实现,为简化用户操作,现对现有平台进行二次封装,通过API接口的形式进行前后端分离,通过前端界面操作实现BS(对外提供的服务)、BP、BO(逻辑处理或调用外部的服务)自动生成(通过%Dictionary实现),具体实现如下。
一、开发技术和工具
版本:Ensemble 2017.2.1
二、涉及公用类
2.1 %Dictionary.ClassDefinition(自定义类)
• property Super as %CacheString; Specifies one or more superclasses for the class. 定义一个或多个父类,继承父类
• property** ProcedureBlock** as %Boolean [ InitialExpression = 0 ]; Specifies that the class uses procedure block for method code. 设置类是否允许使用程序块,程序块强制实施变量作用域:方法无法看到由其调用方定义的变量,程序块中的任何变量都会自动成为私有变量
第二十一章 CSP Session 管理 - 身份验证和加密
身份验证和加密
在发送到 HTTP 客户端的页面上放置状态信息是很常见的。当从这些页面发出后续请求时,会将状态信息发送回服务器。很多时候,重要的是将状态信息放置在网页上,以便 a) HTTP 源的查看者无法确定状态信息的值,并且 b) 服务器可以验证返回的信息是,实际上,从同一服务器和会话发送出去。通过其加密服务,CSP 提供了一种易于使用的机制来实现这一点。
Session Key
CSP 可以使用加密密钥对服务器上的数据进行加密和解密。每个 CSP session 都有一个唯一的会话密钥(可通对象 Key 属性中的 %CSP.Session 访问),用于加密会话数据。这种机制是安全的,因为会话密钥永远不会发送到 HTTP 客户端;它作为 %CSP.Session 的一部分保留在 CSP 服务器上,位于对象中。
可以在类中使用 %CSP.Page的 Encrypt 方法手动加密服务器上的值。可以随后使用 Decrypt 方法解密此值。
加密 URL 和 CSPToken
在某些情况下(如下所述),从 .csp 文件生成的类会自动加密发送到客户端的 URL 值(对于手动创建的类,必须在类中调用 %CSP.Page的 Link 方法才能执行此操作)。
例如,假设 .csp 文件包含定义指向另一个页面的链接的锚标记:
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!
CORS请求Request携带Cookie失败占用License解决方案
起因
因为是前后端分离的项目,前端使用的
vue2,后端iris。需要获取cooike的sessionid,每次请求时携带cookie,防止每次请求都占用一个license。登录认证,保持会话期间全局变量,超时退出。
现象
下图是如果不携带cookie每次请求都会新建一个session并且占用一个license。
解决过程
所以基于上述情况,需要每次获取响应response的cookie,保存下来,下次请求request再携带保存下来的cookie。
如图Set-Cookie内容:
CSPSESSIONID- 为SessionID的CSPSessionCookieCSPWSERVERID- 服务器ID,负载均衡时会用到,如果ID不对应,则会报错。
后端方法为%CSP.Response的WriteHTTPHeaderCookies():
第二十章 CSP Session 管理 - 状态管理
状态管理
因为 HTTP 是无状态协议。为 Web 编写的应用程序必须使用特殊技术来管理应用程序上下文或状态。 CSP 提供了许多用于状态管理的机制。这些中的每一个都可能适用于特定情况。
请求之间的跟踪数据
Web 应用程序中状态管理的基本问题是跟踪连续 HTTP 请求之间的信息。有许多可用的技术,包括:
- 使用隐藏的表单字段或
URL参数在单个页面上存储数据 - 将数据存储在客户端的
cookie中 - 将数据存储在服务器上的对象中的
%CSP.Session中 - 在
Caché数据库中存储数据
在页面中存储数据
要将状态信息存储在页面中,必须放置它以便来自该页面的后续请求包含该信息。
如果页面通过超链接发出请求,则数据应放置在超链接的 URL 中。例如,这是一个包含在 .csp 文件中定义的状态信息的超链接:
<a href="page2.csp?DATA=#(data)#">Page 2</A>
当 CSP 为包含此链接的页面提供服务时,表达式 #(data)# 将替换为发送给客户端的文本中的服务器变量 data 的值。当用户选择这个指向 page2.csp 的链接时,CSP 服务器可以通过 %request 对象访问 DATA 的值。如果需要,CSP 可以对此类数据进行编码。
如果页面包含表单,可以将状态信息放置在隐藏字段中:
ObjectScript是一种面向对象的编程语言,它是InterSystems公司的Caché和Ensemble数据库的核心语言之一。ObjectScript语言的语法类似于MUMPS语言,它支持面向对象编程、过程式编程、函数式编程等多种编程范式。ObjectScript语言主要用于开发Caché和Ensemble数据库应用程序,它可以访问数据库中的数据、调用数据库中的存储过程、触发器和事件,还可以与其他编程语言进行交互。
Cache使用的语言是ObjectScript简称COS,下面展示的是其基本语法,也是我个人的COS字典:
1 系统指令
SET 缩写 s ,赋值命令,样例 - s hello ="Hello World";
WRITE 缩写 w ,向当前设备输出,样例 - w hello (特殊用法:w ! 换行、w # 清屏)
DO 缩写 d ,执行函数,样例 – d ##class(%SYSTEM.License).ShowSummary();
Kill 缩写 k ,从堆栈中清楚变量 x,慎用(不加参数调用时候将清楚内存中的所有变量!)样例 - k x
Quit 缩写 q , 返回样例 - q $$$OK
注意:系统指令不区分大小写,变量和对象大小写敏感
2 数据类型
前言
本人因技术需要,了解到了IRIS Health产品,在听了产品介绍会之后,感觉该产品是否有趣,并且比较符合自己目前的需求,因此大概了解了下IRIS的架构。以下是本人的浅显理解,如有错误之处欢迎讨论。
本人从产品介绍和社区的文档中,了解到IRIS的大概功能分类
- InterSystems IRIS是一款数据平台,适用于软甲开发人员
- 基于FHIR
- 整合医疗全流程数据,通过机器学习和人工智能分析
- 业务优化
- 数据管理
- Sharding数据分片技术
- 分布式架构
- IRIS互操作性
- 数据分析能力
- IRIS对FHIR的支持
- 机器学习与自动化
其中结合到自己想要研究的领域,想要探索是否可以利用该产品并结合其他工具开发一套通用的专病数据库构建及应用方法。

