搜索​​​​

清除过滤器
文章
Claire Zheng · 一月 20, 2021

InterSystems API 管理器简介

大家可能已经听说过,我们近期推出了InterSystems API管理器 (以下简称IAM)。InterSystems IRIS数据平台™新增了一项功能,支持用户监视、控制和管理IT基础架构中基于Web的API间通信。 在本文中,我将向大家展示如何设置IAM,并重点介绍IAM中可用的一些功能。InterSystems API管理器可提供你所需的一切功能。 监视基于HTTP的API通信,并了解谁在使用你的API、你最受欢迎的API是什么,哪些可能需要重新实现。 使用多种方式对API用户进行控制及限制。从简单的访问限制、API流量限制,到请求有效负载微调,你可以进行细粒度控制并快速做出反应。 使用集中式安全机制(如OAuth2.0或密钥和令牌身份验证)保护API。 招募第三方开发人员,为第三方开发人员提供一个专门的开发门户来满足他们的需求,并从一开始就为他们提供良好的开发体验。 扩展API需求并实现低延迟响应。 我很高兴为大家介绍IAM,让您一睹为快。 入门 从WRC Software Distribution站点下载IAM,并将其部署为自身的docker容器。 请确保满足以下最低要求: Docker引擎可用。最低支持版本是17.04.0+。 Docker-compose CLI工具可用。最低支持版本是1.12.0+。 第一步需要加载docker镜像,通过如下: docker load -i iam_image.tar 这样一来,IAM镜像可在你的计算机进行后续使用。IAM作为一个独立运行的容器,可以单独从InterSystems IRIS后端对其进行扩展。 启动IAM前,需要访问IRIS实例来加载所需的许可证信息。须进行以下配置更改: 启用/api/IAM web应用程序 启用IAM用户 更改IAM用户密码 现在,我们可以开始配置IAM容器了。在distribution tarball里可以找到一个名为“iam-setup”的Windows和Unix系统脚本。该脚本可帮助你正确地设置环境变量,使IAM容器能够与InterSystems IRIS实例建立连接。这是我在Mac终端会话中的运行示例: source ./iam-setup.sh Welcome to the InterSystems IRIS and InterSystems API Manager (IAM) setup script.This script sets the ISC_IRIS_URL environment variable that is used by the IAM container to get the IAM license key from InterSystems IRIS.Enter the full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1Enter the IP address for your InterSystems IRIS instance. The IP address has to be accessible from within the IAM container, therefore, do not use "localhost" or "127.0.0.1" if IRIS is running on your local machine. Instead use the public IP address of your local machine. If IRIS is running in a container, use the public IP address of the host environment, not the IP address of the IRIS container. xxx.xxx.xxx.xxx Enter the web server port for your InterSystems IRIS instance: 52773Enter the password for the IAM user for your InterSystems IRIS instance: Re-enter your password: Your inputs are:Full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1IP address for your InterSystems IRIS instance: xxx.xxx.xxx.xxxWeb server port for your InterSystems IRIS instance: 52773Would you like to continue with these inputs (y/n)? yGetting IAM license using your inputs...Successfully got IAM license!The ISC_IRIS_URL environment variable was set to: http://IAM:****************@xxx.xxx.xxx.xxx:52773/api/iam/licenseWARNING: The environment variable is set for this shell only!To start the services, run the following command in the top level directory: docker-compose up -dTo stop the services, run the following command in the top level directory: docker-compose downURL for the IAM Manager portal: http://localhost:8002 我隐藏了IP地址和密码,但这足以让大家了解配置是多么简单。现在我们得到了开始下一步前所需的全部内容:InterSystems IRIS实例的完整镜像名称、IP地址和端口,以及IAM用户密码。 现在可以通过执行以下命令启动IAM容器: docker-compose up -d 该命令将开始协调IAM容器,并确保以正确的顺序启动所有内容。 你可以使用以下命令检查容器的状态: docker ps 在浏览器中输入localhost:8002会出现基于web的用户界面: 因为这是一个全新的节点,所以全局报告中未显示任何吞吐量。但我们很快就会改变这个情况。我们可以看到,IAM支持“Workspace(工作区)”概念,将工作划分为“module”和/或“team”。向下滚动并选择“default”工作区会将我们带到“Dashboard”界面。我们将在“default”工作区开始首次实验。 同样,这个工作区的请求数量也是零,但是你可以先在左侧的菜单中了解一下API网关的重要概念。前两个元素——即服务和路由——是最重要的。服务是指向用户公开的API。因此,IRIS实例中的REST API被视为一种服务,就像你所使用的Google API一样。路由决定应将传入请求路由到哪些服务。每个路由都有一组特定的条件,如果满足这些条件,就会将请求路由到相关的服务。大家需要了解的是,路由可以匹配发送者的IP或域、HTTP方法、部分URI,或者其中的几种。 现在让我们创建一个IRIS实例的服务,其值如下: 保留其他所有内容的默认设置。现在让我们创建一个路由: 同样,对其他所有内容保留默认设置。默认情况下,IAM正在监听端口8000上的传入请求。从现在开始,发送到http://localhost:8000并以/api/atelier路径开头的请求将被路由到IRIS实例。 让我们在REST客户端尝试一下(我使用的是Postman)。 向http://localhost:8000/api/atelier/发送一个GET请求会从IRIS实例返回一个响应。每个请求都经过IAM,并监视HTTP状态码、延迟和用户(如果已配置)等指标。我接着发出了另外几个请求(包含对不存在的端点的两个请求,如/api/atelier/test/),可以在Dashboard中看到汇总: 使用插件 既然已经有了一个基本的路由,那么可以开始管理API流量了。现在我们可以开始添加补充服务的行为。现在可以创造奇迹了。 执行某种行为最常见的方法就是添加插件。插件可提供一些功能,并且通常可以附加到IAM的某个部分。它们可能会对全局运行产生影响,也可能只对单个用户(组)、服务或路由等产生影响。首先,我们在路由中添加限速插件。此时需要确保插件和路由之间建立的链接是路由的唯一ID。这些可以从路由的详细信息里找到。 如果按照本文的步骤进行,那么你的路由ID是不一样的。复制ID继续下一步。 单击左侧工具栏菜单上的“Plugins”。通常可以在此界面上看到所有的活动插件,但由于这个节点相对较新,所以未显示任何活动插件。选择“Add New Plugin”继续下一步。 我们要选择的插件在“Traffic Control”类中,名为“Rate Limiting”。选中该插件。由于插件非常灵活,所以我们可以在这里定义非常多的字段,但现在我们只关心两个字段: 如上所示,插件已配置并处于活动状态。你可能已经发现有多种时间间隔可以选择,比如分钟、小时或天。我特意选择了分钟,因为这样可以让我们很容易理解这个插件产生的效果。 如果在Postman中再次发送相同的请求,会发现响应返回了两个附加的头信息:XRateLimit-Limit-minute (value 5) 和XRateLimit-Remaining-minute(value 4)。这是在告诉客户端,每分钟最多可以调用5次,并且在当前时间间隔内还有4个请求可用。 如果不断地发出相同的请求,最终会用完可用配额,得到一个带有以下负载的HTTP状态码429: 等这一分钟结束后,就可以再次调用。这是一个非常方便的机制,可以完成以下工作: 1. 确保后端避免高峰值 2. 为客户端设置一个期望值,即允许以透明的方式为服务进行多少次调用 3. 引入分级制有望从API流量中获利(例如,青铜级别每小时调用100次,而黄金级别则不受限制) 你可以为不同的时间间隔设置值,从而在一定时期内平滑API流量。假设允许某条路由每小时进行600次调用,平均每分钟调用10次。但是,你没有阻止客户端在一小时的第一分钟就用光600次调用(也许这就是你想要的)。也行你想让负载在一个小时内分配得更均匀。将config_minute字段设置为20,这样就可以确保用户每分钟调用的次数不超过20次,每小时不超过600次。这将使分钟级别的间隔出现一些峰值,因为它们平均每分钟只能调用10次,但用户不能在一分钟内用完一小时配额。现在,至少需要30分钟,系统才会达到满负荷运行。客户端将在每个配置的时间间隔内收到附加标头,例如: header value X-RateLimit-Limit-hour 600 X-RateLimit-Remaining-hour 595 X-RateLimit-Limit-minute 20 X-RateLimit-Remaining-minute 16 当然,可以采用多种不同的方法配置rate-limits,这取决于你想要实现的目标。 对此我不再做过多介绍,因为作为一篇介绍InterSystems API Manager的文章,上述介绍已经足够了。IAM还可以用来实现更多的事情。我们刚刚只用了40多个插件中的一个,甚至还没有使用到所有的核心概念,你还可以实现以下任务: 为所有服务添加集中式身份验证机制 通过负载均衡请求扩展到支持同一组API的多个目标 向更小的受众介绍新特性或bugfixes,并在向大家发布之前监视的进展情况 为内部和外部开发人员提供一个专用的、可自定义的开发人员门户,记录他们有权访问的所有API 缓存常见的请求响应,以减少响应延迟和服务系统上的负载 所以,请大家试一试IAM,并在下面评论区留下建议。我们努力推出这一功能,希望了解大家可以使用这项技术克服哪些挑战。 更多资源 官方新闻稿:InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities 短动画视频概述:什么是InterSystems API Manager?(英文) What is InterSystems API Manager 8分钟小视频带你了解主要亮点:InterSystems API管理器简介(英文) Introducing InterSystems API Manager 选自IRIS文档部分内容:InterSystems API管理器文档(英文) InterSystems API Manager Documentation 注:本文为译文,欢迎点击查看原文,原文由Stefan Wittmann撰写 IAM 是只能在docker 里运行吗? 对,目前IAM提供的是容器版本。如果有对IAM的需求,可以联系InterSystems的销售和销售工程师。 欢迎联系Intersystems 中国服务热线:400-601-9890,谢谢!
公告
Claire Zheng · 二月 1, 2021

InterSystems 2021年度编程大奖赛

大家好! InterSystems IRIS开发者们,我们有一个好消息要跟大家分享! 我们很高兴能够邀请大家参加我们今年的年度大奖赛,利用InterSystems IRIS数据平台创建开源解决方案! 🏆 InterSystems编程大奖赛 🏆 时间: 2021年2月8日 - 3月8日 奖金总额: $16,000 奖项设置 这次我们提升了现金奖励力度! 请看: 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $6,000 🥈 第二名 - $3,000 🥉 第三名 - $2,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $3,000 🥈 第二名 - $1,500 🥉 第三名 - $500 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个! 参赛时间安排 根据大家的反馈意见,我们做出了调整! 我们为开发留出了更多时间!所以: 🛠 2月8日- 28日: 应用程序开发和注册阶段(在此期间,您可以持续编辑自己的项目) ✅ 3月1日-7日: 投票阶段 🎉 3月8日: 宣布优胜者! 主题 💡 InterSystems IRIS 应用程序 💡 提交使用InterSystems IRIS作为后端(API或数据库)的应用程序,使用任何类型的InterSystems IRIS API或数据模型均可。 我们欢迎您进一步改进您去年在InterSystems系列竞赛中提出的申请,并将其提交参加大奖赛。当然,也欢迎您提交一份全新的申请。 应用程序应该可以在 IRIS Community Edition 或 IRIS for Health Community Edition 或 IRIS Advanced Analytics Community Edition 上运行。 应用程序应该开源并在GitHub上发布。 资源助力 示例程序: objectscript-docker-template rest-api-contest-template native-api-contest-template integratedml-demo-template PythonGateway-template iris-fhir-template iris-fullstack-template iris-interoperability-template iris-analytics-template 如何把您的APP提交给大赛: 如何在 InterSystems Open Exchange 上发布应用程序 如何把参赛APP提交给大赛 公平公正 点击查看 投票规则. 万分期待你的精彩项目! 加入大奖赛吧! ❗️ 点击此处,查看 官方竞赛术语解读. ❗️ 顶一下 IRIS 在线培训:https://learning.intersystems.com/ 在线实验室Lab:https://learning.intersystems.com/course/view.php?id=929 恭喜发财,大家踊跃报名啊! 这次我们提升了现金奖励力度,欢迎大家积极报名! 投票通道开启,欢迎参赛选手踊跃拉票啊。 https://openexchange.intersystems.com/contest/current @jingqi.liu @Weiwei.Yang @deming.xu @Botai.Zhang very good 非常棒,都是很好的应用,我会投票的。 积极投票 踊跃投票! 这些应用都是很好的解决方案! 现在这个很火爆,可惜我不会,我也要学习编程了 可以看到这么多优秀的应用,很棒👍
文章
姚 鑫 · 三月 1, 2021

第二章 InterSystems SQL基础

# 第二章 InterSystems SQL基础 本章概述了InterSystems SQL的特性,特别是那些SQL标准未涵盖的特性,或者与InterSystems IRIS®数据平台统一数据架构相关的特性。 本教程假定读者具备SQL知识,并不是为介绍SQL概念或语法而设计的。 本章讨论以下主题: - 表 - 查询 - 权限 - 数据显示选项 - 数据排序类型 - 执行SQL # 表 在InterSystems SQL中,数据显示在表中。每个表都包含许多列。一个表可以包含零个或多个数据值行。以下术语大体上等效: 数据术语 | 关系数据库术语| InterSystems IRIS术语 ---|---|--- 数据库 | 架构| 包 数据库 | 表 | persistent class(持久类) 字段 | 列 | 属性 记录 | 行 | 表有两种基本类型:基表(包含数据,通常简称为表)和视图(基于一个或多个表提供逻辑视图)。 ## 模式与架构 SQL模式提供了一种将相关表,视图,存储过程和缓存查询的集合进行分组的方法。模式的使用有助于防止表级别的命名冲突,因为表,视图或存储过程的名称在其模式内必须唯一。应用程序可以在多个架构中指定表。 SQL模式与持久性类包相对应。通常,模式与其相应的程序包具有相同的名称,但是由于不同的模式命名约定或故意指定了不同的名称,因此这些名称可能有所不同。模式到程序包的映射在SQL到类名的转换中有进一步描述。 **模式是在特定的名称空间中定义的。模式名称在其名称空间内必须是唯一的。将第一个项目分配给它时,会自动创建一个模式(及其对应的程序包),从中删除最后一个项目时,会自动将其删除。** 可以指定一个限定或不限定的SQL名称,限定名称指定模式:schema.name。 非限定名不指定模式名。 如果不指定模式,InterSystems IRIS将提供如下模式: - 对于DDL操作,InterSystems IRIS使用系统范围的默认架构名称。此默认值可配置。它适用于所有名称空间。 - 对于DML操作,InterSystems IRIS可以使用用户提供的模式搜索路径或系统范围内的默认模式名称。在动态SQL,嵌入式SQL和SQL Shell中,使用了不同的技术来提供模式搜索路径。 DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL 要查看名称空间内的所有现有模式,请执行以下操作: 1. 在管理门户中,选择“系统资源管理器”,然后选择“ SQL”。使用页面顶部的Switch选项选择一个名称空间;这将显示可用名称空间的列表。选择一个名称空间。 ![image](/sites/default/files/inline/images/tu_pian__1.png) ![image](/sites/default/files/inline/images/2_12.png) 2. 选择屏幕左侧的Schema下拉列表。这将显示当前名称空间中的架构列表。从该列表中选择一个模式;所选名称将出现在“模式”框中。 ![image](/sites/default/files/inline/images/3_10.png) 3. 如果有数据下拉列表允许选择表,视图,过程或缓存的查询,或所有属于模式的所有这些。设置此选项后,单击三角形以查看项目列表。如果没有项目,则单击三角形无效。 ![image](/sites/default/files/inline/images/4_4.png) # 查询 在InterSystems SQL中,可以通过查询查看和修改表中的数据。粗略地说,查询有两种形式:查询数据(SELECT语句)和修改数据(INSERT,UPDATE和DELETE语句)。 可以通过多种方式使用SQL查询: - 在ObjectScript中使用嵌入式SQL。 - 在ObjectScript中使用动态SQL。 - 调用使用CREATE PROCEDURE或CREATE QUERY创建的存储过程。 - 使用类查询。 - 使用来自各种其他环境的ODBC或JDBC接口。 # 权限 InterSystems SQL提供了一种通过权限来限制对表、视图等的访问的方法。 # 数据显示选项 InterSystems SQL使用SelectMode选项来指定如何显示或存储数据。 可用的选项有Logical、Display和ODBC。 数据在内部以逻辑模式存储,并且可以在这些模式中的任何一种中显示。 通过使用`LogicalToDisplay()`、`LogicalToODBC()`、`DisplayToLogical()`和`odbcological()`方法,每个数据类型类都可以在内部逻辑格式和显示格式或ODBC格式之间进行转换。 当显示SQL SelectMode时,将应用LogicalToDisplay转换,并对返回值进行格式化以便显示。 默认的SQL SelectMode是逻辑的; 因此,默认情况下返回值以存储格式显示。 SelectMode影响查询结果集数据显示的格式,SelectMode还影响应该提供数据值的格式,例如在WHERE子句中。 InterSystems IRIS根据存储模式和指定的SelectMode选择合适的转换方法。 所提供的数据值与SelectMode之间的不匹配可能导致错误或错误的结果。 例如,如果`DOB`是一个以`$HOROLOG`逻辑格式存储的日期,并且WHERE子句指定`DOB > 2000-01-01 `(ODBC格式),则SelectMode = ODBC返回预期的结果。 `SelectMode = Display`生成`SQLCODE -146`,无法将日期输入转换为有效的逻辑日期值。 `SelectMode =Logic`将 `2000-01-01`解析为逻辑日期值,并返回零行。 对于大多数数据类型,三种SelectMode模式返回相同的结果。 以下数据类型受SelectMode选项影响: - 日期,时间和时间戳数据类型。 InterSystems SQL支持多种日期,时间和时间戳数据类型(`%Library.Date`,`%Library.Time`,`%Library.PosixTime`,`%Library.TimeStamp`和`%MV.Date`)。除`%Library.TimeStamp`外,这些数据类型对逻辑,显示和ODBC模式使用不同的表示形式。在其中的几种数据类型中,InterSystems IRIS以`$HOROLOG`格式存储日期。此逻辑模式内部表示包括从任意起始日期(1840年12月31日)起的天数的整数,逗号分隔符以及从当天午夜开始的秒数的整数。 InterSystems IRIS将`%PosixTime`时间戳存储为编码的64位带符号整数。在“显示”模式下,日期和时间通常以数据类型的FORMAT参数指定的格式显示,或者当前语言环境的日期和时间格式默认为`%SYS.NLS.Format`。美国语言环境的默认值为`DD / MM / YYYY hh:mm:ss`。在ODBC模式下,日期和时间始终表示为`YYYY-MM-DD hh:mm:ss.fff`。 `%Library.TimeStamp`数据类型还将这种ODBC格式用于逻辑和显示模式。 - `%LIST`数据类型。InterSystems IRIS逻辑模式使用两个非打印字符存储列表,这两个字符出现在列表中的第一个项目之前,并显示为列表项目之间的分隔符。在ODBC SelectMode中,列表项显示时列表项之间带有逗号分隔符。在Display SelectMode中,列表项显示时,列表项之间有空格分隔符。 - 指定`VALUELIST`和`DISPLAYLIST`的数据类型。如果处于显示模式,并且在字段具有`DISPLAYLIST`的表中插入一个值,则输入的显示值必须与`DISPLAYLIST`中的一项完全匹配。 - 空字符串和空BLOB(流字段)。在逻辑模式下,空字符串和BLOB由非显示字符`$CHAR(0)`表示。在显示模式下,它们由空字符串(“”)表示。 SQL SelectMode可以指定如下: - 对于当前进程,请使用`$SYSTEM.SQL.SetSelectMode()`。 - 对于InterSystems SQL Shell会话,请使用SET SELECTMODE命令。 - 使用“显示模式”下拉列表,从管理门户“执行查询”用户界面(系统资源管理器,SQL)获得查询结果集。 - 对于动态SQL `%SQL.Statement`实例,请使用`%SelectMode`属性。 - 对于嵌入式SQL,请使用ObjectScript `#SQLCompile` Select预处理器指令设置。该伪指令允许使用第四个值Runtime,它将选择模式设置为RuntimeMode属性设置为:逻辑,显示或ODBC。 RuntimeMode的默认值为Logical。 - 对于使用SELECTMODE关键字的SQL命令CREATE QUERY,CREATE METHOD,CREATE PROCEDURE和CREATE FUNCTION。 - 通过使用`%EXTERNAL`,`%INTERNAL`和`%ODBCOUT`函数在SQL查询中的单个列。 # 数据排序 Collation种类决定了值的排序和比较方式,它是InterSystems SQL和InterSystems IRIS对象的一部分。 **可以指定排序规则类型作为字段/属性保护的一部分。除非另有说明,否则字符串字段/属性默认为命名空间默认排序规则。默认情况下,字符串的命名空间默认排序规则是SQLUPPER。 SQLUPPER排序规则将字符串转换为大写,以便排序和比较。因此,除非另有说明,字符串排序和比较不区分大小写。** 可以指定排序规则类型作为索引保护的一部分,或者使用索引字段的排序规则类型。 通过将排序函数应用于字段名,SQL查询可以覆盖未保护的字段/属性排序规则类型。ORDER BY子句指定查询的结果集序列;如果指定的字符串字段被保护为SQLUPPER,查询结果顺序不区分大小写。 # 执行SQL InterSystems IRIS支持多种方法来编写和执行SQL代码。其中包括: - 嵌入式SQL:嵌入在ObjectScript代码中的SQL代码。 - 动态SQL:使用`%SQL.Statement`类从ObjectScript中执行的SQL代码。 - `Execute()`方法:使用`%SYSTEM.SQL`类的`Execute()`方法执行SQL代码。 - 包含SQL代码的存储过程,使用CREATE PROCEDURE或CREATE Query创建。 - SQL Shell:从终端界面执行的SQL语句。 - 执行查询界面:从管理门户执行的SQL语句。 可以使用InterSystems IRIS对象(类和方法)执行以下操作: - 持久性类(SQL表)。 - 定义索引。 - 定义并使用类查询。 关于动态SQL能再详细说说吗? 实用帖,非常好的学习知识,感谢!
文章
姚 鑫 · 二月 28, 2021

第一章 InterSystems SQL简介

# 第一章 InterSystems SQL简介 InterSystems SQL提供对InterSystems IRIS®Data Platform数据库中存储的数据的无懈可击的标准关系访问。 InterSystems SQL提供以下优势: - 高性能和可扩展性-InterSystems SQL提供优于其他关系数据库产品的性能和可扩展性。此外,InterSystems SQL可以在各种硬件和操作系统上运行;从笔记本电脑到高端多CPU系统。 - 与InterSystems IRIS对象技术集成-InterSystems SQL与InterSystems IRIS Object技术紧密集成。可以混合使用关系访问和对象访问数据,而不会牺牲任何一种方法的性能。 - 维护成本低-与其他关系数据库不同,InterSystems IRIS应用程序不需要在已部署的应用程序中重建索引和压缩表格。 - 支持标准SQL查询-InterSystems SQL支持SQL-92标准语法和命令。在大多数情况下,可以毫不费力地将现有关系应用程序迁移到InterSystems IRIS,并自动利用InterSystems IRIS更高的性能和对象功能。 可以将InterSystems SQL用于多种目的,包括: - 基于对象和基于Web的应用程序-可以在InterSystems IRIS对象和Web Server Page应用程序中使用SQL查询来执行强大的数据库操作,如查找和搜索。 - 在线事务处理-InterSystems SQL为INSERT和UPDATE操作以及事务处理应用程序中常见的查询类型提供了出色的性能。 - 商业智能和数据仓库-InterSystems IRIS多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用程序的最佳选择。 - 即时查询和报告-可以使用InterSystems SQL附带的功能齐全的ODBC和JDBC驱动程序连接到流行的报告和查询工具。 - 企业应用程序集成-InterSystems SQL Gateway使能够无缝地通过SQL访问ODBC或JDBC兼容的外部关系数据库中存储的数据。这使得在InterSystems IRIS应用程序中集成来自各种来源的数据变得容易。 # 架构 InterSystems SQL的核心由以下组件组成: - 统一数据字典-存储为一系列类定义的所有元信息的存储库。InterSystems IRIS自动为统一字典中存储的每个持久类创建关系访问(表)。 - SQL处理器和优化器-一组程序,用于解析和分析SQL查询,确定给定查询的最佳搜索策略(使用复杂的基于成本的优化器),并生成执行查询的代码。 - InterSystems SQL Server-一组InterSystems IRIS服务器进程,负责与InterSystems ODBC和JDBC驱动程序的所有通信。它还管理频繁使用的查询的高速缓存;当同一查询被多次执行时,可以从查询高速缓存中检索其执行计划,而不必由优化器再次处理。 ## 特点 InterSystems SQL包括一整套标准的关系型功能。这些措施包括: - 定义表和视图(DDL或数据定义语言)的能力。 - 对表和视图(DML或数据操作语言)执行查询的能力。 - 能够执行事务,包括插入、更新和删除操作。执行并发操作时,InterSystems SQL使用行级锁。 - 为更高效的查询定义和使用索引的能力。 - 能够使用各种数据类型,包括用户定义的类型。 - 定义用户和角色并为其分配权限的能力。 - 定义外键和其他完整性约束的能力。 - 定义INSERT、UPDATE和DELETE触发器的能力。 - 定义和执行存储过程的能力。 - 能够以不同的格式返回数据:用于客户端访问的ODBC模式;用于在基于服务器的应用程序中使用的显示模式。 ## 符合SQL-92 SQL-92标准在算术运算符优先级方面是不精确的;关于这一问题的假设因SQL实现而异。InterSystems SQL支持将系统配置为以下任一系统范围的SQL算术运算符优先级替代方案: - InterSystems SQL可以配置为严格按照从左到右的顺序解析算术表达式,没有运算符优先级。这与ObjectScript中使用的约定相同。因此,3+3*5=30。可以使用括号来强制执行所需的优先顺序。因此,3+(3*5)=18。 - InterSystems SQL可以配置为使用ANSI优先级分析算术表达式,这为乘法和除法运算符提供了比加法、减法和串联运算符更高的优先级。因此,3+3*5=18。如果需要,可以使用括号覆盖此优先级。因此,(3+3)*5=30。 SQL运算符优先级的默认值取决于InterSystems IRIS版本。 InterSystems SQL支持完整的入门级SQL-92标准,但有以下例外: - 不支持向表定义添加附加的CHECK约束。 - 不支持SERIALIZABLE(序列化)隔离级别。 - 分隔标识符不区分大小写;标准规定它们应该区分大小写。 - 在HAVING子句中包含的子查询中,应该能够引用该HAVING子句中“可用”的聚合。这不受支持。 ## 拓展 - InterSystems SQL支持许多有用的扩展。其中许多都与InterSystems IRIS提供对数据的同步对象和关系访问这一事实有关。 其中一些扩展包括: - 支持用户可定义的数据类型和函数。 - 以下对象引用的特殊语法。 - 支持子类化和继承。 - 支持对存储在其他数据库中的外部表进行查询。 - 用于控制表的存储结构以实现最高性能的多种机制。 ## 互操作性 - InterSystems SQL支持多种与其他应用程序和软件工具互操作的方法。 ## JDBC InterSystems IRIS包括一个符合标准的第4级JDBC客户机(全部是纯Java代码)。 InterSystems JDBC驱动程序提供以下特性: - 高性能 - 纯JAVA代码实现 - UNICODE支持 - 线程安全 可以将InterSystems JDBC与任何支持JDBC的工具、应用程序或开发环境一起使用。 ## ODBC InterSystems SQL的c语言调用级接口是ODBC。与其他数据库产品不同,InterSystems ODBC驱动程序是一个本机驱动程序——它不是构建在任何其他专有接口之上的。 InterSystems ODBC驱动程序提供以下功能: - 高性能 - 可移植性 - 原生Unicode支持 - 线程安全 可以将InterSystems ODBC与支持ODBC的任何工具,应用程序或开发环境一起使用。 ## 嵌入式SQL 在ObjectScript中,InterSystems SQL支持嵌入式SQL: **将SQL语句放置在方法(或其他代码)主体中的能力。使用嵌入式SQL,可以查询单个记录,或定义一个游标,然后使用该游标查询多个记录。嵌入式SQL已编译。默认情况下,它是在第一次执行(运行时)时进行编译的,而不是在包含它的例程进行编译时进行的。因此,在运行时检查SQLCODE错误很重要。** 还可以与包含嵌入式SQL的ObjectScript例程同时编译嵌入式SQL。 与InterSystems IRIS的对象访问功能结合使用时,嵌入式SQL的功能非常强大。例如,以下方法查找具有给定Name值的记录的RowID: ``` /// w ##class(PHA.TEST.SQL).FindByName("姚鑫") ClassMethod FindByName(fullname As %String) { &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname) IF SQLCODE < 0 { SET baderr="SQLCODE ERROR:"_SQLCODE_" "_%msg RETURN baderr } ELSEIF SQLCODE = 100 { SET nodata="Query returns no data" RETURN nodata } RETURN "RowID="_id } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=6 ``` 注意: 如果 Name 查处多条的话 id为查询的第一条数据 指定倒序,为最后一条。 ``` &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname order by ID desc) ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=14 ``` ![image](/sites/default/files/inline/images/tu_pian__0.png) # 动态SQL 作为其标准库的一部分,InterSystems IRIS提供了一个%SQL.Statement类,可以使用它来执行动态(即在运行时定义的)SQL语句。可以在ObjectScript方法中使用动态SQL。例如,下面的方法查询指定数量的21世纪出生的人。该查询选择1999年12月31日之后出生的所有人,按出生日期对所选记录进行排序,然后选择前x条记录: ``` /// w ##class(PHA.TEST.SQL).Born21stC("姚鑫") ClassMethod Born21stC(x) { /// w ##class(PHA.TEST.SQL).Born21stC("1") ClassMethod Born21stC(x) { SET myquery=2 SET myquery(1) = "SELECT TOP ? Name,%EXTERNAL(DOB) FROM Sample.Person " SET myquery(2) = "WHERE DOB > 58073 ORDER BY DOB" SET tStatement = ##class(%SQL.Statement).%New() SET qStatus = tStatement.%Prepare(.myquery) IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT} SET rset = tStatement.%Execute(x) DO rset.%Display() WRITE !,"End of data" q "" } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).Born21stC("2") Name Expression_2 Ingrahm,Susan N. 02/10/2001 Goldman,Will H. 09/22/2002 2 Rows(s) Affected End of data ``` 准备查询时,该查询的优化版本将存储为缓存查询。该缓存查询被执行用于查询的后续调用,从而避免了每次执行查询时重新优化查询的开销。 ## 限制 请注意InterSystems SQL的以下限制: NLS可用于为单个全局变量以及当前运行的进程中的局部变量指定特定国家区域设置行为的$ORDER行为。InterSystems SQL可以在任何国家语言环境中使用和良好地工作。然而,InterSystems SQL当前的一个限制是,对于任何特定进程,它引用的所有相关全局变量都必须使用与当前进程区域设置相同的国家区域设置。 文章写得非常棒!学习! 学习到新知识sql动态查询,感谢!
文章
Qiao Peng · 三月 5, 2021

InterSystems IRIS 元素周期表

InterSystems IRIS 元素周期表 PDF 版本: GIT 源: InterSystems IRIS 是一个具有许多功能的数据平台。 这些功能和相关的 IRIS 主题都体现在元素周期表中。
文章
姚 鑫 · 六月 8, 2021

第一章 InterSystems XML工具简介

# 第一章 InterSystems XML工具简介 介绍了如何使用 IRIS `XML`工具。 InterSystems IRIS为`XML`处理带来了对象的力量--可以使用对象作为`XML`文档的直接表示,反之亦然。由于InterSystems IRIS包括本机对象数据库,因此可以将此类对象直接用于数据库。此外,InterSystems IRIS提供了用于处理`XML`文档和`DOM`(文档对象模型)的工具,即使它们与任何InterSystems IRIS类无关。 # 用XML表示对象数据 有些InterSystems IRIS `XML`工具主要用于支持`XML`的类。要为类启用`XML`,需要将`%XML.Adaptor`添加到其超类列表中。`%XML.Adaptor`类使能够将该类的实例表示为XML文档。可以添加类参数和属性参数来微调投影。 ![image](/sites/default/files/inline/images/1_48.png) 对于启用了`XML`的类,数据可以采用以下所有形式: - 包含在类实例中。根据类的不同,还可以将数据保存到磁盘,在磁盘中数据可以像其他持久类一样以所有相同的方式使用。 - 包含在`XML`文档中,可以是文件、流或其他文档。 - 包含在`DOM`(文档对象模型)中。 下图概述了用于在这些表单之间转换数据的工具: ![image](/sites/default/files/inline/images/2_28.png) `%XML.Writer`类使能够创建`XML`文档。输出目的地通常是文件或流。确定要包括在输出中的对象,系统根据在类定义中建立的规则生成输出。 `%XML.Reader`类使能够将合适的`XML`文档导入到类实例中。源通常是文件或流。要使用此类,需要指定类名和`XML`文档中包含的元素之间的关联。给定的元素必须具有相应类所需的结构。然后您逐个节点地阅读文档。这样做时,系统会创建该类的内存中实例,其中包含在`XML`文档中找到的数据。 `DOM`也是处理`XML`文档的有用方法。可以使用`%XML.Reader`类读取`XML`文档并创建表示它的`DOM`。在此表示中,`DOM`是一系列节点,可以根据需要在它们之间导航。具体地说,将创建`%XML.Document`的一个实例,该实例表示文档本身并包含节点。然后使用`%XML.Node`检查和操作节点。如果需要,可以使用`%XML.Writer`重新编写XML文档。 InterSystems IRIS `XML`工具提供了许多方法来访问和修改`XML`文档和`DOM`中的数据。 # 创建任意XML 还可以使用InterSystems IRIS `XML`工具创建和使用任意XML-即不映射到任何InterSystems IRIS类的`XML`。要创建任意XML文档,请使用`%XML.Writer`。该类提供了用于添加元素、添加属性、添加命名空间声明等的方法。 要创建任意DOM,请使用`%XML.Document`。该类提供了一个类方法,该方法返回具有单个空节点的DOM。然后根据需要使用该类的实例方法添加节点。 或者使用`%XML.Reader`读取任意XML文档,然后从该文档创建DOM。 # 访问数据 InterSystems IRIS `XML`工具提供了几种访问XML格式数据的方法。下图显示了摘要: ![image](/sites/default/files/inline/images/3_23.png) 对于任何格式良好的XML文档,都可以使用以下类来处理该文档中的数据: - `%XML.TextReader`-可以使用它逐个节点地读取和解析文档。 - `%XML.XPATH.Document`-可以使用它来获取数据,方法是使用引用文档中特定节点的`XPath`表达式。 在InterSystems IRIS中,DOM是`%XML.Document`的实例。该实例表示文档本身并包含节点。可以使用该类的属性和方法从`DOM`中检索值。可以使用`%XML.Node`检查和操作节点。 # 修改XML InterSystems IRIS XML工具还提供了修改`XML`格式数据的方法。下图显示了摘要: ![image](/sites/default/files/inline/images/4_17.png) 对于`XML`文档,可以使用`%XML.XSLT.Transformer`中的类方法执行`XSLT`转换并获得文档的修改版本。 对于DOM,可以使用`%XML.Document`的方法修改`DOM`。例如,可以添加或删除元素或属性。 # SAX解析器 InterSystems IRIS XML工具使用InterSystems IRIS SAX(Simple API For XML)解析器。这是一个内置的SAX XML验证解析器,使用标准`Xerces`库。`SAX`是一个解析引擎,它提供完整的XML验证和文档解析。InterSystems IRIS SAX使用高性能的进程内调入机制与InterSystems IRIS进程通信。使用此解析器,可以使用内置的InterSystems IRIS XML支持或通过在InterSystems IRIS中提供您自己的自定义`SAX`接口类来处理`XML`文档。 对于特殊应用程序,可以创建自定义实体解析器和内容处理程序。 可以使用行业标准的`XMLDTD`或模式验证来验证任何传入的`XML`,并且可以指定要解析的XML项。 # 其他XML工具 InterSystems IRIS `XML`支持包括以下附加工具: - XML架构向导读取XML架构文档,并生成一组支持XML的类,这些类与架构中定义的类型相对应。可以指定一个包来包含类,以及控制类定义详细信息的各种选项。 - `%XML.Schema`类使能够从一组启用了XML的类生成XML架构。 - `%XML.Namespaces`类使能够检查XML命名空间以及其中的类,以查找InterSystems IRIS命名空间。 - `%XML.Security.EncryptedData`类和其他类使能够加密XML文档以及解密加密文档。 - `%XML.Security.Signature`类和其他类使能够对XML文档进行数字签名,以及验证数字签名。 # 使用XML工具时的注意事项 在使用任何类型的XML工具时,至少有三个一般要点需要考虑: - 任何XML文档都有字符编码 - 将XML文档映射到类(文字或`SOAP`编码)有不同的方法 - 应该知道SAX解析器的默认行为 # 输入输出的字符编码 导出XML文档时,可以指定要使用的字符编码;否则,InterSystems IRIS会根据目标选择编码: - **如果输出目标是文件或二进制流,则默认值为`“UTF-8”`**。 - 如果输出目标是字符串或字符流,则默认`为"UTF-16"`。 对于InterSystems IRIS读取的任何`XML`文档,文档的XML声明应该指示该文件的字符编码,并且文档应该按照声明的方式进行编码。例如: ``` ``` 但是,如果文档中未声明字符编码,InterSystems IRIS将假定: - 如果输出目标是文件或二进制流,则默认值为`“UTF-8”`。 - 如果输出目标是字符串或字符流,则默认为`"UTF-16"`。 # 选择文档格式 使用`XML`文档时,必须知道将文档映射到InterSystems IRIS类时要使用的格式。同样,在创建`XML`文档时,需要指定编写文档时要使用的文档格式。`XML`文档格式如下: - 文字表示文档是对象实例的文字副本。在大多数情况下,即使在使用`SOAP`时,也使用文字格式。除非另有说明,否则文档中的示例均使用文字格式。 - 编码的意思是按照`SOAP 1.1`标准或`SOAP 1.2`标准中描述的编码。`SOAP1.1`和`SOAP1.2`的细节略有不同。 以下小节显示了这些文档格式之间的差异。 ## 文字格式 ```java Klingman,Julie G. 1946-07-21 W897 Bensonhurst 60302 Jung,Kirsten K. Xiang,Charles R. Frith,Terry R. ``` ## 编码格式 相比之下,下面的示例以编码格式显示相同的数据: ```java ... Jung,Kirsten K. ... Quixote,Umberto D. ... Chadwick,Mark L. ... Klingman,Julie G. 1946-07-21 W897 Bensonhurst 60302 ... ``` 请注意编码版本中的以下差异: - 输出的根元素包括`SOAP`编码命名空间和其他标准命名空间的声明。 - 本文档包括同一级别的人员、地址和医生元素。`Address`和`Doctor`元素列出了引用它们的`Person`元素使用的唯一`ID`。每个对象值属性都是这样处理的。 - 顶级`Address`和`Doctor`元素的名称与各自类的名称相同,而不是与引用它们的属性名称相同。 - 编码格式不包括任何属性。`GroupID`属性被映射为`Person`类中的属性。在文字格式中,此属性被投影为特性。但是,在编码版本中,属性被投影为元素。 - 对集合的处理方式不同。例如,列表元素具有属性`ENC:arrayType`.。 - 每个元素都有一个`xsi:type`属性的值。 注意:对于`SOAP1.2`,编码版本略有不同。要轻松区分版本,请检查SOAP编码命名空间的声明: - 对于`SOAP1.1,SOAP`编码命名空间为`"http://schemas.xmlsoap.org/soap/encoding/"` - 对于`SOAP1.2,SOAP`编码命名空间为`"http://schemas.xmlsoap.org/wsdl/soap12/"` 除非解析器可以使用这些其他模式,否则验证将失败。特别是对于WSDL文档,有时需要下载所有模式并编辑主模式以使用正确的位置。 它尝试解析所有实体,包括所有外部实体。(其他XML解析器也会这样做。)。这一过程可能很耗时,具体取决于它们所在的位置。具体地说,`Xerces `使用网络访问器来解析一些URL,并且实现使用阻塞I/O。因此,不会超时,网络获取可能会在错误条件下挂起,这在实践中很少见。 此外,`Xerces`不支持`https`;也就是说,它不能解析位于`https`位置的实体。 如果需要,可以创建自定义实体解析器,也可以禁用实体解析; # IRIS支持的标准 IRIS XML支持遵循以下标准: - XML 1.0 (https://www.w3.org/TR/REC-xml/) - Namespaces in XML 1.0 (https://www.w3.org/TR/REC-xml-names/) - XML Schema 1.0 (https://www.w3.org/TR/xmlschema-0/, https://www.w3.org/TR/xmlschema-1/, https://www.w3.org/TR/xmlschema-2/) - XPath 1.0 as specified by https://www.w3.org/TR/xpath - SOAP 1.1标准第5节指定的SOAP 1.1编码。 - SOAP1.2编码,如第3节第2部分: Adjuncts (https://www.w3.org/TR/soap12-part2/) of the SOAP 1.2 standard. - XML Canonicalization Version 1.0 (also known as inclusive canonicalization), as specified by https://www.w3.org/TR/xml-c14n. - XML Exclusive Canonicalization Version 1.0 as specified by https://www.w3.org/TR/xml-exc-c14n/, including the InclusiveNamespaces PrefixList feature (https://www.w3.org/TR/xml-exc-c14n/#def-InclusiveNamespaces-PrefixList) - XML Encryption (https://www.w3.org/TR/xmlenc-core/) InterSystems IRIS支持使用RSA-OAEP或RSA-1.5进行密钥加密,并支持使用AES-128、AES-192或AES-256对邮件正文进行数据加密。 - XML Signature using Exclusive XML Canonicalization and RSA SHA-1 (https://www.w3.org/TR/xmldsig-core/) InterSystems IRIS提供两个XSLT处理器: - Xalan处理器支持XSLT 1.0。 - Saxon处理器支持XSLT 2.0。 **注意:InterSystems IRIS不支持在一个元素中有多个名称相同的属性,每个属性位于不同的名称空间中。**
公告
Claire Zheng · 六月 20, 2021

InterSystems 开发者竞赛:人工智能与机器学习

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 🏆 InterSystems 编程大赛:人工智能与机器学习 🏆 竞赛时间: 2021年6月28日 - 7月25日 奖金总额: $8,750 奖项设置 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名- $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $500 🥉 第三名 - $250 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金。 谁可以参加 任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 参赛时间安排 🛠 6月 28日 - 7月18日: 应用开发、提交阶段 ✅ 7月19日 - 7月 25日: 投票阶段 🎉 7月26日: 宣布优胜者! 注意:在整个参赛期间(开发与投票期间,即6月28日-7月25日),开发者可持续编辑、提升其应用 主题 🤖 人工智能与机器学习 🤖 利用InterSystems IRIS开发一个AI/ML解决方案。您的应用程序可以是一个库(library)、包(package)、工具(tool)或任何使用InterSystems IRIS的AI/ML解决方案。 以下是参赛须知: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 利用InterSystems IRIS构建使用AI/ML功能的应用程序。 该应用应该在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition 上工作。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 (如果有),那么InterSystems ObjectScript部分的源代码应该以UDL(而非XML)格式提交, 举例说明。 上述要求可能会按需修订 资源助力 1. 我们建议从以下模板开始: InterSystems IntegragedML template IRIS R Gateway template 2. 数据导入工具 Data Import Wizard CSVGEN - CSV import util CSVGEN-UI - the web UI for CSVGEN 3. 文档 Using IntegratedML 4. 在线资源 Learn IntegratedML in InterSystems IRIS Preparing Your Data for Machine Learning Predictive Modeling with the Machine Learning Toolkit 5. 如何将您的APP提交给大赛:: 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 参赛评比 投票规则即将发布,敬请期待! 期待您的精彩提交!加入我们的编程马拉松,赢取大奖! ❗️点击此处,查看 官方竞赛条款解读❗️ 成为社区活跃客户后即可参与投票:https://cn.community.intersystems.com/post/%E5%A6%82%E4%BD%95%E6%9B%B4%E5%A5%BD%E5%9C%B0%E6%88%90%E4%B8%BA%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE%E8%80%85%E6%B4%BB%E8%B7%83%E7%94%A8%E6%88%B7%EF%BC%9F
公告
Michael Lei · 九月 17, 2022

InterSystems Docker 桌面扩展正式发布

好消息, InterSystems 容器镜像仓库Docker桌面扩展已正式发布供大家 下载 . 大家可以在Docker桌面版的marketplace 下载.下载后需要重启 Docker Desktop to 欢迎在github repository中给我们反馈, 点击这里
文章
Michael Lei · 十一月 2, 2022

InterSystems IRIS医疗版的“专精特新”

门为医疗行业打造,深度整合国内外医疗行业标准,专有技术服务医疗行业44年,可能是全球最早从事医疗信息化的公司; 耕细做打磨数十年的稳定、可靠、易用、可扩展的数据平台; 色鲜明,不唯技术、终生负责、以解决客户问题为核心的特色企业文化; 一代混合一体化架构,一个平台同时支持混合事务处理、传统架构、容器化、云原生等多种应用场景;
公告
Michael Lei · 一月 27, 2023

InterSystems IRIS 持久化类审计包

大家好, 我在 OEX 上加载了一个新软件包,我也计划在本月参加比赛。 简而言之,它为您提供以下内容。 用于 InterSystems IRIS 的持久(表)类以保存记录历史的基类 这些类允许在touch时将持久类记录历史化到另一个持久类中。 这提供了任何记录的完整历史记录。 它允许记录回滚到特定版本。 它可以自动清除旧的历史记录。 请检查一下。 谢谢你们。
文章
Michael Lei · 四月 4, 2023

InterSystems SQL 小妙招

嗨开发者们! 如您所知,InterSystems IRIS 除了Global、对象、文档和 XML 数据模型还支持关系,其中 SQL 语言也被用来处理数据。 与其他关系型 DBMS 一样,InterSystems IRIS 有自己的特点。 我开始这篇文章是为了抛砖引玉,并邀请您分享您的小诀窍 - 我会根据收到的评论更新内容。 开始了! 列出数据库中的所有表: SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE= 'BASE TABLE' 感谢@Dmitry.Maslennikov 使用当前日期和当前时间作为默认值创建表: CREATE TABLE CUSTOMER ( ID INTEGER PRIMARY KEY NOT NULL , NAME VARCHAR ( 100 ) NOT NULL , PASSWORD VARCHAR ( 20 ) NOT NULL , LAST_UPDATED TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL , REGISTRATION_DATE DATE DEFAULT CURRENT_DATE NOT NULL ); 注意不带括号的函数 CURRENT_TIMESTAMP 和 CURRENT_DATE。 创建在内部使用 ObjectScript 的存储过程/函数: CREATE OR REPLACE FUNCTION IRIS_VERSION() RETURNS VARCHAR LANGUAGE OBJECTSCRIPT { Return $ZV } 调用存储过程/函数: select IRIS_VERSION() as "Version" 调用内部函数。 返回 IRIS 版本: Select $ version 返回当前命名空间: Select $namespace 欢迎大家在评论区留下你的小妙招! 分页查询: select top :row * from PatientInfo where id not in (select top 10(:page-1) id from PatientInfo order by id asc) order by id
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - 互操作消息管理

InterSystems 数据平台的互操作功能与久经考验的Ensemble和HealthConnect集成引擎产品一脉相承。事实上,使用IRIS的典型客户不但应用了IRIS提供的多模型数据存储、分布式存储等数据存储特性,也广泛地应用如可视化数据转换,可视化数据流程编辑和可视化规则引擎等一系列互操作能力构建异构系统间或组织机构间的数据流程。 那么,在生产环境上,如何监控与评估数据流程的运行状况,在发生问题时如何快速定位并解决故障,就是用户的运维团队需要考虑的问题。 本系列文章将围绕IRIS互操作功能中核心的互操作消息管理,Production管理与优化及互操作告警与通知三个方面介绍互操作功能的运维基础知识和常用技巧,希望能够帮助客户平稳、高效地运用数据平台。 注:本文提到的InterSystems数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。 互操作消息管理 消息是互操作功能中各组件间通信的基本方法,在互操作Production业务服务、业务流程和业务操作之间广泛使用。 除承担信息传递的基本功能外,由于常常需要在生产环境中查看消息内容或重发消息以解决问题,消息检索就是大家最常用到的功能,而IRIS特有的结构化消息存储也为开发和运维团队使用和管理消息创造了便利。用户能够通过消息的内容,某项具体属性,来源/目标和发生时间等条件检索和过滤消息,迅速找到自己感兴趣的信息。 我们先回顾下消息的结构与关联的上下文。 消息结构 如图所示,消息分为消息头与消息体两部分。其中消息头(标头)主要用于记录消息发生的来源、趣向、时间和消息类型等上下文信息,而消息体(正文)则为消息的具体内容。 而在消息的上下文中,会话是一个比较重要的概念,它用于表达一次交互过程中,从初始的输入所触发的所有消息。在使用时,需要注意: Message Trace将显示一个会话的所有信息 消息查看器默认只列出会话开始的信息(绿色消息) 消息检索 下图即为平台自带的消息查看器,可通过Ensemble > 查看 > 消息导航访问(Ensemble菜单项在IRIS和HealthConnect产品中的名称为Interoperability,位置,含义均相同,下文中将不再赘述)。 可见其中包含若干预制条件及可灵活扩展的查询条件以应对不同场景的需求。 需要注意的是,对检索所需的消息体或头属性建立索引很重要。因为在生产环境中,production中的消息存量可以轻易达到百万、千万甚至亿级,对于海量数据不经过索引进行检索就性能而言不可行。 应用SQL检索消息 如果需要,也可以使用SQL语句进行搜索 系统资源管理器SQL执行查询。 在运行前切换到正确的命名空间。 可以参考消息查看器使用的SQL语句来修改 在Terminal中,在执行搜索的命名空间中运行以下代码。 Set ^Ens.Debug("UtilEnsMessages", "sql")=1 在消息查看器中执行搜索 根据需要从消息查看器复制、修改和执行SQL。 需要SQL知识 用户可直接运用平台提供的SQL示例检索消息,这样的SQL也为用户学习和掌握IRIS持久话消息的结构和辅助函数等概念提供了基础。 用户在熟悉消息结构,并了解SQL的条件下,配合Search Table、索引等特性,可以实现更复杂的基于消息内容的查询。 其中,关于Search Table的应用,用户也可参考我们的另一篇文章《互操作消息统一管理系列:SearchTable加速检索》。此处不再赘述。 异常消息的处理 重发消息 借助消息的持久化,当通信异常导致消息传递失败时,用户也可通过重发消息重新触发业务 挂起消息 如果业务组件运行错误,可能会挂起消息 手动停止消息 队列查看页 > 选择业务组件 > 挂起按钮 组件配置页 > 作业 > 挂起按钮 挂起后消息保持静止,等待手工处理 用户也可有针对性地查看和处理被挂起的消息。 查看挂起消息 Ensemble > 查看 > 已挂起的消息 重发已挂起消息 从已挂起消息页重发将发送被挂起的这条消息 从消息查看器重发将复制并发送一条新的消息 中断消息 IRIS的业务组件有自动重发消息的能力。但但运维团队明确远端故障已发生,短期内重发消息没有意义时,也可下达指令丢弃消息,不再进行后续处理。 业务组件处于重试状态时 组件配置页 > 作业 > 放弃按钮 Ensemble > 监视器 > 队列 > 点击业务组件 > 选择活动的消息 > Abort 或 Abort All 按钮 中断被堆积的消息 Ensemble > 监视器 > 队列 > 点击业务组件 > 选择排队的消息 > Abort 或 Abort All 按钮
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - Production管理与优化

Production是开发者基于InterSystems IRIS产品家族实现互操作功能的主要技术架构。而每个Production的运行依赖于三类主要的业务组件: 业务服务(Business Service) 业务流程(Business Process) 业务操作(Business Operation) 三类组件间以消息作为信息交换的主要媒介。因此,要保障互操作业务的稳定运行,除保障软件平台有充足的软硬件资源运行外,保障Production中消息的高效传输以及三类组件的平稳、高效运行则是运维团队面临的主要目标。下面列举的若干项任务则有助于运维团队实现这些目标: 优化业务组件运行效率 Production中的业务组件都有运行池的概念,允许业务组件运行在多个进程上并发工作以提高整体性能。运行池又可以分为私有池和参与者池两类。 私有运行池 业务组件的CPU作业的数量 默认为1即可工作 通过性能测试确定最佳的池大小 拥有私有池的业务组件从私有队列中处理消息 无适配器业务服务的池大小需设置为0 需要多进程时,池大小设为1可以保证信息以先进先出(FIFO)顺序处理 整个消息流中的所有业务组件的池大小都不应大于1 参与者池 Production级的参与者池设置 用于处理公共队列中的请求的CPU作业的数量 由使用公共队列的所有业务流程共享。 业务流程和业务操作的池大小设置。 0 - 使用参与者池和公共队列 非0--使用私人队列,有指定的CPU作业数 对于FIFO,设置池大小=1 参与者池与业务流程的启停 任何一个池大小为0(仅使用公有池)的业务流程被禁用时,所有的参与者都不会启动 防止任何池大小为0的业务组件从公共队列中处理消息 要保障其他参与者正常工作 将要被禁用的组件的Pool Size改为大于0并应用 如果已经禁用,要启动其他参与者 保持组件禁用,但将其Pool Size为大于0并应用 Production的运行维护 Production本身具备一系列的运行状态管理功能,帮助运维团队在生产环境上处理Production运行的一系列任务,包括 Production运行维护 – 自动启动 Ensemble > 管理 自动启动Production > 选择要自动启动的Production 在Ensemble启动时自动启动Production 如果需要的话,会自动调用RecoverProduction()方法,恢复Production状态 系统级启用开关 系统管理 > 配置 > 其他设置 > 启动 > EnsembleAutoStart 默认情况下为 "真"。 在排除故障时,可能需要禁用。 Production运行维护 – 强制关闭 如果Production关闭得太慢 等待关闭超时 显示强制关闭按钮 Production运行维护 – 更新 运行的组件与它的底层类代码不同步,需要Production来更新 业务组件进程因错误而意外关闭,需要重新启动 设置的改变需要业务组件重新启动 更新按钮出现在Production配置页面。 Production运行维护 – 恢复 在非正常关机和一些错误之后出现 如果需要,自动启动Production将在启动前自动恢复 Production运行维护 – 中断 在配置页面上显示 Production被关闭时如果满足如下条件之一: 有同步消息在等待响应。 或者,队列非空,意味着Production还没处理完消息 或者,消息仍在被组件处理 或者,有级别较高的告警请求 Production中断后的选项 重新启动Production以完成消息的处理 如果启动后消息仍然被组件不断重试(提示故障未排除) 修复导致重试的问题 挂起消息 中断消息 在测试系统中(决不能是生产系统),如果你决定必须完全清除所有队列,请调用Ens.Director类的CleanProduction()方法 do ##class(Ens.Director).CleanProduction() Production的配置 Production本身是基于InterSystems的大量预制组件经开发或直接部署产生的软件包,因此将包含大量不需要在代码中固定写好的配置项,例如远程连接的地址,扫描数据表使用的SQL等。运维团队的工作之一,就是在外部环境发生变化,例如第三方系统部署地址发生变化时,通过调整Production的设置来应对变化,而无需更改已部署的代码。 凭据 用于登录远程系统。 在出站适配器的凭据设置中指定 在Ensemble > 配置 > 凭据中设置 Production配置数据的来源 导出Production 配置页 > Production设置 > 操作选项卡 > 导出 创建与类/部件相关的XML文件 验证是否需要额外的类 可用于 部署到另一个实例中 部署到另一个命名空间 保存Production 部署Production Ensemble à 管理 à 部署变化 à 部署 会创建回滚文件及部署日志 导出与部署的当前限制 除业务组件外,组件配置、规则、DT等组件运行依赖的部件不会自动被识别,需要人工选取并导出 DSN, 凭据等含安全信息的配置不会被导出(实例级配置,非Production级配置),需要手动在部署端配置。产品化研发中需要考虑通过自定义任务定期同步到备机或其他实例。 清除Production数据 当Production在生产中运行较长时间后,往往会累积大量的告警,事件日志和互操作消息等运行数据。用户可选择定期删除一部分不再需要的数据,保证磁盘空间的充裕。 直接执行 Ensemble > 管理 > 清除管理数据 直接执行清除任务受限于浏览器进程超时设置,如在清除过程中触发超时,将导致清除进程失效退出,中断消息清除过程。 对于大量消息累积的场景,请使用后台任务周期性执行确保清除效果。由于删除数据时也将产生大量的journal,删除前应在journal所在存储上保留充裕的空间。 后台任务 系统操作 > 任务管理器 > 新任务 空闲超时设置 组件被标记为不活动,如果 组件在给定的#秒内没有活动 黄色表示不活动的组件 Production监控 配置页面 Production运行监控 IRIS平台为用户提供了一系列工具展现组件的运行状态。运维团队需要频繁地使用这些工具用于定位和诊断故障,识别性能瓶颈等。 Production监视器 一页式监控业务服务、业务操作、队列和错误。 点击单个组件了解详情 提供对队列和事件日志的访问 事件日志 检索、过滤和清除日志 联合使用事件日志和可视化追踪 错误、警报和警告事件日志条目显示在可视化追踪中 点击图标可以查看事件日志详情 业务规则日志 Ensemble > 查看 > 业务规则日志 每次尝试匹配规则时的条目 空原因表示没有匹配的规则 日志内容 I/O 记录 组件配置 除了Production信息外,还对输入和输出数据进行存档 TCP输入输出 文件输入输出 输入和输出数据显示在可视化跟踪窗口中 组件状态指示器 状态指示器提供业务组件健康状况的可视化 绿色 – 正常 黄色 – 不活动(项目空闲时间超过其空闲超时设置) 红色 - 错误。 灰色 - 禁用。 暗绿色或暗灰色 -- Production目前没有运行 紫色 - 遇到失败但在重试的信息 消息队列 要查看队列 Ensemble > 监视器 > 队列 > 在队列中点击消息查看详情 Production配置页 > 选择组件 > 队列Tab 组件在给定的#秒内没有活动 可以查看、挂起和中断整个队列的消息处理 消息队列与性能调优 消息队列的变化常常可以用于评估组件性能及识别性能瓶颈,运维团队可以根据瓶颈所在位置和上下游组件队列的变化情况调整Pool Size获得优化性能。 忽然暴增的队列 如果发生在业务操作 通常由外部系统导致 连接中断 暴增的业务高峰 如果发生在业务流程 业务流程可能出现错误,导致它以某种方式 "卡住” 长期堆积的队列 如果发生在业务操作 可能是在向外部应用程序发送消息时出现持续延迟 看看外部系统的性能问题是否能得到解决。 如果不能,考虑增加池子的大小设置(除非需要FIFO) 如果发生在业务流程 考虑增加池(私有池或参与者池)大小的设置(除非需要FIFO) 可能有算法缺陷,考虑优化 多个队列长期堆积 潜在的原因 主机容量不够(内存/CPU/IO) Ensemble需要更多的资源(内存、CPU) 底层的Caché实例可能需要调整(内存、IO) 永远不要低估低速存储的影响 作业 提供关于CPU作业运行配置项的信息 Job # = 操作系统进程ID 状态 Dequeuing - 等待信息被处理(最常看到的) Running - 工作,重试或无限循环 Quiescent - 生产关闭期间的状态 Error 能够按照日程周期运行的作业非常适合用于执行系统运维任务 周期性清除过期Production数据 按照备份策略周期性执行全量、累积和增量备份 定期清除过期的数据库journal 定期对数据库进行一执行检查 定期对数据库执行压缩截断释放空间(慎用) 定期将无法通过mirror同步的配置推送到备机(例如DSN、凭据等) 活动量监控 活动量和持续时间监视器显示每个接口的统计数据 Ensemble > 监视器 > 活动量和持续时间。 按时间段过滤(分钟、小时、天、周、月、年) 可以根据需要建立自己的仪表盘来显示所需数据 也可通过SQL查询 启用活动量收集 将Ens.Activity.Operation.Local Business Operation添加到Production中 为统计数据指定存储命名空间 为Production启用统计数据收集 do ##class(Ens.Util.Statistics).EnableStatsForProduction() 为命名空间的Web应用程序启用DeepSee 系统管理 > 安全 > 应用程序 > Web应用程序 使用PurgeActivityData任务进行清理。 使用作业控制周期任务
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - 互操作告警与通知

在互操作功能运行过程中,IRIS可以识别异常情况的发生,自动生成告警事件并通过预制的互操作组件将告警转发给干系人;另外,IRIS也内建了告警工作台,可供运维团队基于工作流实现对告警的管理。 告警设置与转发 Production告警设置 在Production级别可以设置对连接异常的告警设置,及告警组件设置 组件告警设置 控制何时触发警报。 队列计数警报。 队列中的信息数量 队列等待警报。 消息在队列中停留的秒数 不活动超时。 业务组件不活动的秒数 在v2012.1之前,不会触发告警 警报宽限期 与外部连接有关的错误可以有宽限期设置 设置重新建立连接的时间,超时且连接不成功才会发出告警 业务服务 警报宽限期 业务操作 再次发出警报宽限期 转发告警 EnsLib.EMail.AlertOperation 内置告警转发组件 通过Email转发 路由到其他接口转发 REST - 短信 REST - 钉钉 用户需要执行的规划 什么样的告警需要即时通知 告警的通知是否应该成为一个应用 包含告警组件的Production 包含告警组件与业务组件的Production形态如下 其中,用于告警的业务组件包括 告警托管 在互操作功能中产生的告警可以选择转发到第三方系统触发告警运维工作流,也可以在IRIS中进行托管,通过IRIS提供的较为简单的工作流定义实现对告警的统一存储及管理。 工作原理 告警管理BP 决定是否产生新的托管告警 可以设置告警的所有者 通知管理BP 决定如何发送告警 决定谁将收到通知 将告警通知发送到指定组件 告警监视BS(可选组件) 可以将过期告警升级 决定是否发出提醒 典型的告警数据流如下 其中,告警数据产生后经过平台自动丰富,最终形成可供运维人员操作的托管告警 托管告警流程 告警处理流程可能的选择: 告警仅写入日志文件,没有自动通知。 一个简单的告警通知系统,所有告警都通过Email发给用户 根据告警类型和生成告警的组件,将选定告警通过路由发送给不同的用户 实现告警管理框架,用于发送告警通知、升级未解决的告警,并记录当前状态和为解决告警而采取的操作的历史记录 告警路由规则 在告警管理器中可以应用规则,通过路由规则来定义告警的流向。 来源 允许根据不同的故障组件采取不同的行动 消息类 Ens.AlertRequest或无 目标 其他消息路由,用于进一步的路由 业务操作作为最终目标 可以通过数据转换根据传递目标定制告警 托管告警管理 通过Ensemble > 监视器 > 我的托管警报可进入告警管理页 该功能基于IRIS自身的用户设置。告警责任人的分配、告警级别管理、后续操作时限等,都可以在该页上进行操作。 也可通过SQL查询和操作已产生的告警 对于需要自定义工作流的用户,也可以考虑在此基础上实现流程。 祝老师您好,请问系统级别的告警如何推送,就像系统日志中告警级别为2的日志。 Hi, 有两个办法: 1. 自己写代码扫描messages.log获得这些告警 2. 扩展平台内置的告警通知类,可以自定义传感器、消息订阅器和通知分发器,参见 https://docs.intersystems.com/irisforhealth20223/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_healthmon#GCM_healthmon_sysmon_userdefined 感谢祝老师的答复,第一种方法已经实现,我研究下第二种方法。
文章
Lilian Huang · 九月 1, 2022

InterSystems IRIS 中的数据模型

在我们开始谈论数据库和现有的不同数据模型之前,我们最好先谈谈什么是数据库以及如何使用它。 一个数据库是以电子方式存储和访问的有组织的数据集合。 它用于存储和检索通常与主题或活动相关的结构化、半结构化或原始数据。每个数据库的核心至少存在一个用于描述其数据的模型。 并且根据它所基于的模型,一个数据库可能具有略微不同的特征并存储不同数据类型。 要写入、检索、修改、排序、转换或打印数据库中的信息,需要使用称为数据库管理系统 (DBMS) 的软件。 数据库及其各自的数据库管理系统的大小、容量和性能增加了几个数量级。 各个领域的技术进步使之成为可能,例如处理器、计算机内存、计算机存储和计算机网络。 一般来说,数据库技术的发展根据数据模型或结构分为四代:导航型、关系型、对象型和后关系型。 与以特定数据模型为特征的前三代不同,第四代包括许多基于不同模型的不同数据库。 它们包括列、图、文档、组件、多维、键值、内存等。所有这些数据库都由一个单一的名称 NoSQL 联合起来(没有 SQL,或者现在更准确地说不仅仅是 SQL)。 而且,现在出现了一个新的类,叫做NewSQL。 这些是现代关系数据库,旨在为在线事务处理工作负载(读写)提供与 NoSQL 系统相同的可扩展性能,同时使用 SQL 和维护 ACID。 顺便说一下,在这些第四代数据库中,有那些支持上述提及的多种数据模型的数据库。 它们被称为多模型数据库。 这种类型的数据库的一个很好的例子是 InterSystems IRIS。 这就是为什么我将使用它来给出不同类型模型的示例。 第一代数据库使用分层或网络模型。 前者的核心是一个树形结构,即每条记录只有一个所有者。 您可以在 InterSystems IRIS 的示例中看到其工作原理,因为它的主要模型是分层的,并且所有数据都存储在globals(即 B*-trees)中。 您可以在此处here.阅读有关globals的更多信息。 我们可以在 IRIS 中创建这棵树: Set ^a("+7926X", "city") = "Moscow" Set ^a("+7926X", "city", "street") = "Req Square" Set ^a("+7926X", "age") = 25 Set ^a("+7916Y", "city") = "London" Set ^a("+7916Y", "city", "street") = "Baker Street" Set ^a("+7916Y", "age") = 36 在数据库中查看: 在 Edgar F. Codd 于 1969 年提出他的关系代数和他的数据存储理论之后,使用关系原理。之后,关系型数据库产生了。 关系(表)、属性(列)、元组(行)以及最重要的事务和 ACID 要求的使用使这些数据库非常流行,并且现在仍然如此。 例如,我们有架构: 我们可以创建和填充表: 如果我们编写查询: select p.ID, p.Name, a.Country, A.City from My.Person p left join My.Address a on p.Address = a.ID 我们将收到答案: 尽管关系数据库具有显着优势,但随着对象语言的普及,将面向对象的数据存储在数据库中变得很有必要。 这就是为什么 1990 年第一个面向对象(object-oriented )和对象关系数据库产生原因。 后者是在关系数据库的基础上通过添加附加组件来模拟对象工作而创建的。 前者是在 OMG(对象管理组)联盟的建议和 ODMG(对象数据管理组)之后从头开始开发的。 这些面向对象数据库的主要思想如下: 可以使用以下方式访问单个数据仓库: • 对象定义语言——模式定义,允许类定义、它们的属性、关系和方法, • 对象查询语言——声明性的,几乎类似于 SQL 的语言,允许从数据库中获取对象, • 对象操作语言——允许修改和保存数据库中的数据,支持事务和方法调用。 该模型允许使用面向对象的语言从数据库中获取数据。 如果我们采用与前面示例相同的结构但采用面向对象的形式,我们将拥有以下类: Class My.Person Extends %Persistent { Property Name As %Name; Property Address As My.Address; } Class My.Address Extends %Persistent { Property Country; Property City; } 我们可以使用面向对象的语言创建对象: set address = ##class(My.Address).%New() set address.Country = "France" set address.City = "Marseille" do address.%Save() set person = ##class(My.Person).%New() set person.Address = address set person.Name = "Quouinaut, Martin" do person.%Save() 不幸的是,对象数据库并没有成功地从其主导地位与关系数据库竞争,结果出现了许多对象关系映射技术。 无论如何,随着 2000 年代 互联网的普及和对数据存储的新要求的出现,其他数据模型和 数据库管理系统开始出现, 其中,IRIS 中使用了这些模型中的两个,即是文档模型和列模型。 面向文档的数据库用于管理半结构化数据。 这是不遵循固定结构并在其中携带结构的数据。 这种数据库中的每个信息单元都是一个简单的对:一个密钥和一个特定的文档。 该文档通常采用 JSON 格式并包含信息。 由于数据库不需要一定的模式,所以也可以在同一个仓库中集成不同类型的文档。 如果我们再看前面的例子,我们可以有这样的文档: { "Name":"Quouinaut, Martin", "Address":{ "Country":"France", "City":"Paris" } } { "Name":"Merlingue, Luke", "Address":{ "Country":"France", "City":"Nancy" }, "Age":26 } 这两个字段数不同的文档存储在 IRIS 数据库中没有任何问题。 2022.2 版中将提供的模型的最后一个示例是列模型。 在这种情况下,数据库管理系统是按列而不是按行存储数据表。 列方向允许更有效地访问数据以查询列的子集(无需读取不相关的列),并提供更多数据压缩选项。 当列中的数据相似时,按列压缩也更有效。 但是,它们在插入新数据时通常效率较低。 您可以这样创建此表: Create Table My.Address ( city varchar(50), zip varchar(5), country varchar(15) ) WITH STORAGETYPE = COLUMNAR 在这种情况下,类是这样的: Spoiler 然后我们插入数据: insert into My.Address values ('London', '47000', 'UK') insert into My.Address values ('Paris', '54000', 'France') insert into My.Address values ('Kyiv', '03000', 'Ukraine') 在globals里我们看到: 如果我们用city names打开globals,我们将看到 : 如果我们写一个查询: select City from My.Address 我们收到数据: 在这种情况下,数据库管理系统 只需读取一个全局变量即可获得整个结果。 并且在阅读时节省时间和资源。 因此,我们讨论了 InterSystems IRIS 数据库支持的 5 种不同的数据模型。 这些是层次模型、关系模型、对象模型、文档模型和列模型。 希望您在尝试找出可用的模型时会发现这篇文章很有用。 如果您有任何问题,请随时在评论中提出。