搜索​​​​

清除过滤器
公告
Jeff Liu · 二月 26, 2021

2020 年最佳 Open Exchange 应用程序及开发者

大家好! 请查看 2020 年度 Open Exchange 摘要,了解最佳应用程序及其开发者! 欢迎: 2020 年下载量前 20 名的应用程序 iris-history-monitor开发者:Henrique Gonçalves Dias 856 VSCode-ObjectScript开发者:Dmitry Maslennikov 606 PythonGateway开发者:Eduard Lebedyuk 355 Serenji开发者:John Murray 302 ObjectScript Package Manager开发者:Evgeny Shvarov 143 ObjectScript-Math开发者:Peter Steiwer 124 AnalyzeThis开发者:Peter Steiwer 123 DeepSeeButtons开发者:Peter Steiwer 85 PivotSubscriptions开发者:Peter Steiwer 79 iris-rest-api-template开发者:Evgeny Shvarov 77 Caché Monitor开发者:Andreas Schneider 67 Ingestion Speed Test开发者:Amir Samary 60 WebTerminal开发者:Nikita Savchenko 50 DeepSeeWeb开发者:Anton Gnibeda 49 objectscript-docker-template开发者:Evgeny Shvarov 49 csvgen开发者:Evgeny Shvarov 47 ClassExplorer开发者:Nikita Savchenko 41 covid-19 analytics开发者:Evgeny Shvarov 41 Kano MDM开发者:Ludmyla Valerko 34 integratedml-demo-template开发者:Thomas Dyar 34 所有时间排名前 20 的开发者 Robert Cemper 38 Eduard Lebedyuk 35 Evgeny Shvarov 32 Nikita Savchenko 11 Benjamin De Boe 10 Guillaume Rongier 9 Dmitry Maslennikov 8 Sergey Mikhailenko 8 John Murray 7 Peter Steiwer 7 Henrique Gonçalves Dias 7 Amir Samary 7 Semen Makarov 6 Anton Umnikov 6 Rubens Silva 6 Lorenzo Scalese 6 YURI MARX PEREIRA GOMES 6 Alberto Fuentes 5 David Crawford 5 Maks Atygaev 5 所有时间下载量前 20 名 iris-history-monitor开发者:Henrique Gonçalves Dias 998 VSCode-ObjectScript开发者:Dmitry Maslennikov 931 PythonGateway开发者:Eduard Lebedyuk 608 Serenji开发者:John Murray 370 AnalyzeThis开发者:Peter Steiwer 195 WebTerminal开发者:Nikita Savchenko 183 ObjectScript Package Manager开发者:Evgeny Shvarov 179 Caché Monitor开发者:Andreas Schneider 151 DeepSeeButtons开发者:Peter Steiwer 127 ObjectScript-Math开发者:Peter Steiwer 127 Caché 对象脚本中的设计模式开发者:Tiago Ribeiro 116 ClassExplorer开发者:Nikita Savchenko 111 iris-rest-api-template开发者:Evgeny Shvarov 106 PivotSubscriptions开发者:Peter Steiwer 102 objectscript-docker-template开发者:Evgeny Shvarov 80 ObjectScript开发者:Evgeny Shvarov 68 RGateway开发者:Shiao-Bin Soong 64 Ingestion Speed Test开发者:Amir Samary 63 DeepSeeWeb开发者:Anton Gnibeda 61 Cache-FileServer开发者:Eduard Lebedyuk 59
文章
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
文章
姚 鑫 · 九月 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 ``` **注意:紧凑的全局操作旨在与正常的数据库活动同时运行。但是,该操作确实会消耗一些系统资源,并且如果系统处于极高负载下,则可能无法完成。出于这些原因, 建议在非高峰时间运行此和其他数据库重组操作(包括压缩数据库和对全局进行碎片整理),并且一次只在系统上运行一个此类操作**。 **全局压缩可能涉及临时增加正在压缩的数据库大小。如果这导致数据库达到其配置的最大大小,或者由于存储卷上的可用空间不足而无法进行扩展,则取消操作。**
公告
Claire Zheng · 十月 19, 2022

【目前点赞排名】投票倒计时五天:继续为你喜欢的征文作品投票吧!

2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!距离投票截止还有五天(截止至10月23日),我们暂时无法获得专家评审分数,以下根据作品“点赞”进行排名。 N 作者 标题 点赞⬇ 查看数 奖励项目个数 1 Zhe Wang IRIS如何进行CRUD操作 36 197 3 2 Meng Cao Caché数据库私有apache版本升级 33 336 1 3 sun yao 前端操作自动生成BS、BP、BO 22 123 2 4 John Pan 论集成标准的选择对医院信息集成平台建设的影响 21 113 1 5 lizw lizw 关于%Dictionary.CompiledClass类在实际业务中的一些应用 20 114 1 6 聆严 周 使用Prometheus监控Cache集群 18 175 3 7 Chang Liu 在国产系统上安装Healthconnect2021 17 104 2 8 Zhe Wang IRIS快速查询服务思路分享 17 58 3 9 Zhe Wang 使用Global进行数据可视化---商业智能(BI) 16 37 2 10 John Pan 如何调用Ensemble/IRIS内置的HL7 V2 webservice - Java,PB9,Delphi7样例 14 96 2 11 Zhe Wang 小工具:IRIS管理页打开显示查询功能 14 62 2 12 water huang 对 %XML.PropertyParameters类的探索 13 39 1 13 姚 鑫 IRIS与Caché的23种设计模式 13 59 3 14 Zhe Wang Rest实现Post、Get、Put、Delete几种操作方式 13 30 2 15 聆严 周 Cache / IRIS 操作数据的3种基本方式 11 153 1 16 he hf 10分钟快速开发一个连接到InterSystems IRIS数据库的C#应用 11 193 2 17 shaosheng shengshao HEALTHSHARE2018版如何实现AES(CBC)的HEX输出,并可以实现加密和解密 11 63 3 18 water huang Ens.Util.JSON类的启发 9 54 2 19 bai hongtao 第三方HA软件结合MIRROR使用方法探讨 9 69 1 20 li wang HealthConnect访问HTTPS开头地址 8 21 2 21 shaosheng shengshao windows下处理IIS在未安装但Healthshare已安装的时候,部署IIS服务并代理Healthshare 8 43 1 22 zhanglianzhu zhanglianzhu Cache死循环检测和申明式事务 8 101 0 23 Liu Tangh 在Cache系统中使用负载均衡服务的探讨 8 25 1 24 yaoguai wan IRIS架构的浅显理解以及windows10、docker安装IRIS Health详解流程及部分问题浅析 6 30 2 25 Zhe Wang COS的基本语法 3 12 3 *奖励项目详见参赛规则:点击阅读 我们此次征文大赛计分规则如下: 🥇【专家提名奖】评选规则,由经验丰富的专家评审团进行评选打分,与其他加分项综合后进行排名。 🥇【开发者社区奖】评选规则,每个点赞计分为1分,与其他加分项综合后进行排名。 🥇【入围奖】评选规则,成功参赛的其余用户都将获得特别奖励。 每位作者只可以获得一个奖项(即:您只可以获得一次专家提名奖/开发者社区奖/入围奖); 当出现票数相当的平手情况时,将以专家评选投票数作为最终票数高低的判断标准。 那么,抓住最后五天的投票时间,为你喜欢的作品“点赞”投票吧!你的点赞是优秀作品获得【开发者社区奖】的关键! 10月24日,我们将通过Online Meetup宣布获奖名单,敬请留意后续参会信息! 欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
Hao Ma · 九月 22, 2021

IRIS 2021 技术文档 First Look 8 - 技术概要:ODBC和InterSystems数据库

技术概要:ODBC 和 InterSystems 数据库 如果您希望在 InterSystems IRIS®数据平台上使用 ODBC,本文将介绍如何设置它。要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems 技术概要(InterSystems First Looks)。 1 ODBC: 如何在 InterSystems IRIS 中使用它InterSystems 提供了一个完全兼容的(ODBC 3.5)ODBC 驱动程序,您可以使用它通过 ODBC 访问 InterSystems IRIS 数据库。当您安装 InterSystems IRIS 时,默认安装该驱动程序。为了开始在 InterSystems IRIS 中使用 ODBC,您只需要在 InterSystems IRIS 实例上配置驱动程序。本技术概要(First Look)文档对这一过程进行了概述。如果您还不熟悉 ODBC,请参见本文档末尾的 "了解更多信息" 一节中的链接,以获得更多信息。 2 用前须知要使用这个程序,您需要一个安装了 InterSystems IRIS 实例的 Windows 系统。有关如何安装和授权 InterSystems IRIS 开发实例的说明,请参见InterSystems IRIS Basics: Installation(《InterSystems IRIS 基础:安装》)。 3 在 Windows 上设置 ODBC本节介绍如何在 Windows 上为 InterSystems IRIS 数据库创建 DSN。本节中的说明假定您已经安装了 InterSystems ODBC 驱动程序。默认情况下,标准的 InterSystems IRIS 安装过程会安装驱动程序,所以除非您执行了自定义安装,否则驱动程序应该存在于您的实例中。要使应用程序能够通过 ODBC 访问 InterSystems IRIS 数据库,您需要创建一个 DSN,该 DSN 为 ODBC 客户端驱动程序定义数据库的位置。在 Windows 上,您可以从 Windows 控制面板执行此操作,如下所示:1. 打开Windows Administrative Tools control panel(Windows 管理工具控制面板)。2. 选择 Data Sources(数据源)(ODBC)。3. 在 User DSN(用户 DSN) 标签上,选择 Add(添加)。4. 选择 InterSystems ODBC 并点击 Finish(完成)。 技术概要:ODBC 和 InterSystems 数据库 1 了解更多有关 ODBC 的信息 DSN 创建完成后,将显示 InterSystems ODBC Data Source Setup (InterSystems ODBC 数据源设置)对话框。图 1:InterSystems ODBC 数据源设置对话框 5. 输入必要的配置细节:• 输入 DSN 的名称和描述。• 输入与此 DSN 代表的 InterSystems IRIS 数据库相对应的 IP 地址、端口号和命名空间。• 选择一种身份验证方法,并输入或选择适合 InterSystems IRIS 实例的其他安全信息。 6. 选择 Test Connection(测试连接) 按钮来测试您的设置是否正确。 如果连接测试成功,那么恭喜您!您已经完成了 InterSystems IRIS 数据库的设置,以使用 ODBC。现在您可以修改支持 ODBC 的应用程序,以使用刚刚创建的 DSN。 4 了解更多有关 ODBC 的信息如果您更喜欢使用文件 DSN,请参见Using the InterSystems ODBC Driver guide(《使用 InterSystems ODBC 驱动程序指南》)中的 " Using File DSNs and DSN-less Connections(使用文件 DSN 和无 DSN 连接) "一章,以了解相关说明。InterSystems IRIS 还支持 UNIX®上的 ODBC;详情请参见Using the InterSystems ODBC Driver guide(《使用 InterSystems ODBC 驱动程序指南》)中的 " Using an InterSystems Database as an ODBC Data Source on UNIX®(在 UNIX®上使用 InterSystems 数据库作为 ODBC 数据源)"一章。若要在 Windows 上使用 TLS 保护 ODBC 连接,请参见Connecting from a Windows Client Using a Settings File(《使用设置文件从 Windows 客户端进行连接》)。 要了解更多有关 ODBC 和 InterSystems IRIS 的信息,请参见:• Using the InterSystems ODBC Driver(《使用 InterSystems ODBC 驱动程序》) — InterSystems 文档:使用 ODBC 的逐步说明• Using InterSystems SQL(《使用 InterSystems SQL》) — InterSystems 文档:使用 SQL 的逐步说明• InterSystems SQL Reference(《InterSystems SQL 参考文献》) — InterSystems 文档:SQL 参考文献 2 技术概要: ODBC 和 InterSystems 数据库 了解更多有关 ODBC 的信息 • SQL Optimization Guide(《SQL 优化指南》) — InterSystems 文档:优化 InterSystems SQL 性能的指南
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(1):InterSystems IRIS架构

这是“IRIS数据库在医疗行业发展”系列课程的第一讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS架构。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
公告
Jeff Liu · 五月 23, 2021

InterSystems API Manager (IAM)的2.3版本的正式版本已经发布!

InterSystems API Manager (IAM)的2.3版本的正式版本已经发布。 IAM的容器,包括从IAM早期版本升级的所有相关工件,可以从。WRC软件分发站点 的组件区下载. 这个版本的构建号是IAM 2.3.3.2-1。 这个版本是基于Kong企业版2.3.3.2。 InterSystems API Manager 2.3使其更容易以安全的方式和高可用性的场景进行部署 它有许多新的功能,包括: 引入了混合模式 更广泛地支持Docker Secrets 混合模式允许你在数据面和控制面部署IAM节点。当数据平面处理API流量时,控制平面用于配置数据平面节点并观察来自数据平面的遥测数据。这赋予了部署更多的灵活性,减轻了部署HA场景的工作量。关于混合模式的更多信息可以在[这里](https://docs.konghq.com/enterprise/2.3.x/deployment/hybrid-mode/)找到。在接下来的日子里,InterSystems开发者社区也将更详细地介绍这一功能。 IAM 2.3的文档可以在 这里找到。该文档只涉及IAM特有的元素。产品中的文档链接将用户直接带到Kong Enterprise的文档。 从IAM 1.5.0.9升级需要通过两个中间版本进行增量升级,这在文档中会有更详细的描述。 IAM仅以OCI(Open Container Initiative)又称Docker容器格式提供。容器镜像可用于Linux x86-64和Linux ARM64的OCI兼容运行时引擎,详见 支持平台文件。 Best Regards, Stefan
文章
Jeff Liu · 九月 22, 2021

IRIS 2021 技术文档 First Look 9--ADO.NET 和 InterSystems 产品

技术概要:ADO.NET 和 InterSystems 产品 本技术概要(First Look)解释了如何通过 InterSystems ADO.NET Managed Provider 连接到 InterSystems IRIS®数据平台。一旦根据本指南完成操作,就意味着您已经配置了一个 Visual Studio 项目来使用 InterSystems.Data.IRISClient.dll 程序集,建立了到 InterSystems IRIS 的 ADO.NET 连接,从您的 .NET 应用程序运行多个 SQL 语句,并在 InterSystems IRIS 系统管理门户(InterSystems IRIS System Management Portal)中确认这些语句的效果。 为了让您体验一下 ADO.NET Managed Provider,而又不陷入细节的困境,我们会确保这一探索简洁可行。这些活动被设计成只使用默认设置和功能,这样您就可以熟悉功能的基本原理,而不必处理那些离题或过于复杂的细节。当您将 ADO.NET 引入您的生产系统时,您可能需要做一些不同的事情。请确保不要把这种对 ADO.NET 的探索与真实的东西混淆起来! 本文档末尾提供的参考资料将使您对在生产中使用 ADO.NET 所涉及的内容有一个很好的了解。 有关 ADO.NET 的更多文档,请参见结尾处的 Learn More About ADO.NET(了解更多有关 ADO.NET 的信息)。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 为什么 ADO.NET 很重要 ADO.NET 是来自 Microsoft .NET Framework 的数据访问技术,提供对数据源的访问。它用于建立数据库连接,并为 .NET Framework 程序员提供一种标准、可靠的方式,来连接到多种类型的数据源或使用 SQL 对它们进行操作。通过 ADO.NET Managed Provider 连接到 InterSystems IRIS 很简单,特别是如果您以前使用过 ADO.NET。从 .NET 应用程序建立到 InterSystems IRIS 的 ADO.NET 连接,允许您从 .NET 应用程序对 InterSystems IRIS 数据库运行 SQL 命令。 如果您是 InterSystems IRIS 的新手,但熟悉 .NET 和 SQL,您可以立即使用现有的专业知识来帮助您熟悉数据库平台。您可以在开发环境中测试 ADO.NET 连接和 SQL 命令,只需几行代码。 ADO.NET 和 InterSystems IRIS InterSystems IRIS 是完全符合 ADO.NET 规范的实现。InterSystems ADO.NET Managed Provider 提供对数据的简单关系访问。它处理来自应用程序的 ADO.NET 方法调用,并向 InterSystems IRIS 提交 SQL 请求。然后将结果返回给调用的应用程序------在本例中,就是您的 .NET 应用程序。 通过 ADO.NET 连接到 InterSystems IRIS 是一个非常简单的过程。 为了使用 InterSystems IRIS ADO.NET 功能,您必须首先将 InterSystems.Data.IRISClient.dll 程序集作为依赖项添加到 Visual Studio 项目中。确认一些设置后,使用我们的示例代码建立到 InterSystems IRIS 的 ADO.NET 探索 ADO.NET 连接,并执行 SQL 查询。请注意,InterSystems.Data.IRISClient.dll 程序集自始至终都是使用 .NET 管理代码实现的,这使得在 .NET 环境中部署它很容易。它是线程安全(thread-safe)的 ,可以在多线程的 .NET 应用程序中使用。 探索 ADO.NET 我们开发了一个简短的演示,向您展示如何使用 ADO.NET 和 InterSystems IRIS。(想试试 InterSystems IRIS .NET 开发和互操作性功能的在线视频演示?请看.NET QuickStart(.NET 快速入门)!) 用前须知 要使用这个程序,您需要一个安装了 .NET 框架和 Visual Studio 的 Windows 系统,以及一个运行中的 InterSystems IRIS 实例来连接。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。有关如何部署每种类型的实例的信息(如果您还没有可使用的实例) ,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。使用同一文档中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)和 .Net IDE 中的信息将 Visual Studio 连接到您的 InterSystems IRIS 实例。 配置 Visual Studio 项目 在 Visual Studio 主菜单中,通过选择 File(文件) > New (新的)> Project(项目)创建一个新项目。在出现的对话框中,点击 Visual C# 选项,并选择 Console App (.NET Framework)(控制台应用程序(.NET 框架))。对于 Name(名称) 字段,输入 ADONET。点击 OK(確定)。这将使用 .NET Framework 创建一个新的控制台(console)应用程序。 下一步,在 Visual Studio 主菜单中,选择 Project(项目) > ADONET Properties(ADONET 属性)。在 Target framework(目标框架)下,选择 .NET Framework 4.5(.NET 框架 4.5)。 添加程序集引用 InterSystems.Data.IRISClient.dll 程序集必须安装在您的本地系统上。您可以通过克隆 repo https://github.com/intersystems/quickstarts-dotnet/tree/master/EFPlay/bin/Debug 或从该 repo 下载文件来获取它。如果 InterSystems IRIS 安装在您的本地系统或您可以访问的另一个系统上,则该程序集已经安装在子目录 install-dirdevdotnetbinv4.5 中,其中 install-dir 是该实例的安装目录。 要将 InterSystems.Data.IRISClient.dll 的程序集引用添加到项目: 从 Visual Studio 主菜单中,选择 Project(项目) > Add Reference(添加引用)... 在出现的窗口中,点击 Browse(浏览).... 浏览到 InterSystems.Data.IRISClient.dll 文件的位置。 选择文件并点击 Add(添加)。 点击 OK(確定)。 在 Visual Studio Solution Explorer 中, InterSystems.Data.IRISClient.dll 程序集现在应该列在 Reference(引用)下。 探索 ADO.NET 通过 ADO.NET 连接 现在,您可以从 .NET 应用程序连接到 InterSystems IRIS 了。InterSystems ADO.NET Managed Provider 的连接字符串是由定义连接属性的键/值对组成的。连接字符串的语法是: Server=host_IP; Port=superserverPort; Namespace=namespace; Password=password; User ID=username; 其中的变量表示 InterSystems IRIS 实例主机的 IP 地址、实例的超级服务器端口、实例上的命名空间和实例的凭据(credentials)。这与您在连接 Visual Studio 到您的实例时使用的信息相同,如用前须知中所述。 将其粘贴到 Visual Studio 后,在随后的代码中更新该信息。您可以将命名空间设置为预定义的命名空间 USER,如所示,或者设置为您在已安装的实例上创建的另一个命名空间。 using System; ​ using InterSystems.Data.IRISClient; ​ namespace ADONET ​ { ​ class Program ​ { ​ static void Main(string[] args) ​ { ​ String host = "<host>"; String port = "<port>"; ​ String username = "<username>"; String password = "<password>"; String Namespace = "USER"; ​ IRISConnection IRISConnect = new IRISConnection(); IRISConnect.ConnectionString = "Server = " + host ​ + "; Port = " + port + "; Namespace = " + Namespace ​ + "; Password = " + password + "; User ID = " + username; ​ IRISConnect.Open(); ​ String sqlStatement1 = "CREATE TABLE People(ID int, FirstName varchar(255), LastName varchar(255))"; ​ String sqlStatement2 = "INSERT INTO People VALUES (1, 'John', 'Smith')"; String sqlStatement3 = "INSERT INTO People VALUES (2, 'Jane', 'Doe')"; String queryString = "SELECT * FROM People"; ​ IRISCommand cmd1 = new IRISCommand(sqlStatement1, IRISConnect); IRISCommand cmd2 = new IRISCommand(sqlStatement2, IRISConnect); IRISCommand cmd3 = new IRISCommand(sqlStatement3, IRISConnect); IRISCommand cmd4 = new IRISCommand(queryString, IRISConnect); ​ //ExecuteNonQuery() is used for CREATE, INSERT, UPDATE, and DELETE SQL Statements cmd1.ExecuteNonQuery(); ​ cmd2.ExecuteNonQuery(); cmd3.ExecuteNonQuery(); ​ //ExecuteReader() is used for SELECT IRISDataReader Reader = cmd4.ExecuteReader(); ​ Console.WriteLine("Printing out contents of SELECT query: "); while (Reader.Read()) ​ { ​ + ", " ​ Console.WriteLine(Reader.GetValue(0).ToString() + ", " + Reader.GetValue(1).ToString() ​ + Reader.GetValue(2).ToString()); ​ } ​ Reader.Close(); cmd1.Dispose(); cmd2.Dispose(); cmd3.Dispose(); cmd4.Dispose(); IRISConnect.Close(); ​ Console.WriteLine("Press any key to continue..."); ​ Console.ReadKey(); ​ } ​ } ​ } 通过点击 Start(开始)按钮,或按 F5 键来运行代码。 如果连接和查询已经成功完成,您应该会看到一个控制台(console)窗口,其中包含 SELECT 查询的结果。 确认管理门户(Management Portal)的变更 接下来,使用以下程序在管理门户(Management Portal)中确认您的结果: 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的 URL ,在浏览器中打开您的实例的管理门户(Management Portal)。 如果您不在代码指定的命名空间中,请切换到该命名空间(点击页面顶部 Namespace(命名空间):指示器旁边的 Switch(切换))。 导航到 SQL 页面(System Explorer(系统资源管理器) > SQL),然后点击 Execute Query(执行查询)标签,并粘贴以下 SQL 查询: SELECT ID, FirstName, LastName FROM SQLUser.People 点击 Execute(执行)。该页面应该显示在示例代码中创建的 People 表的内容。 了解更多有关 ADO.NET 的信息 要了解更多有关 ADO.NET、SQL 和 InterSystems IRIS 的信息请参见: Using the InterSystems Managed Provider for .NET(《使用 .NET 的 InterSystems Managed Provider》) Using InterSystems SQL(《使用 InterSystems SQL》) ADO.NET Overview(《ADO.NET 概述》)
公告
Claire Zheng · 五月 12, 2021

在AWS上免费申请应用InterSystems IRIS FHIR 加速器服务 (FHIRaaS) !

亲爱的社区开发者们,大家好! InterSystems开发者竞赛:FHIR加速器 已于5月10日开启! 我们邀请所有FHIR开发者们在AWS上使用InterSystems IRIS FHIR加速器服务 (FHIRaaS)上开发或测试您的应用。 现在,我们为您提供绝佳机会,您可以在AWS上免费访问FHIRaaS! 那么,掌握FHIRaaS的第一步,是使用URL的特殊code在ISC Dev FHIR Portal 门户注册,链接如下:👉🏼 https://portal.trial.isccloud.io/account/signup 点击上面的链接,遵循相应步骤,即可掌控InterSystems FHIRaaS! 关于此次竞赛的任何疑问,请随时跟帖提问,或在 discord-contests channel 中提问。 再次欢迎大家加入此次竞赛,成为InterSystems FHIRaaS 大师! ✌🏼 Happy coding! :) 原帖更新: 您可以在AWS上免费访问FHIRaaS! 那么,掌握FHIRaaS的第一步,是使用URL的特殊code在ISC Dev FHIR Portal 门户注册,链接如下:👉🏼 https://portal.trial.isccloud.io/account/signup 不要错过哦!
文章
Jeff Liu · 六月 30, 2021

如何在InterSystems开发者社区学习?第一部分:玩转“关注”

嗨,开发者们! 在这篇文章中,我们想告诉你如何充分利用开发者社区,从InterSystems的技术专家那里学到尽可能多的东西! 请注意这些步骤,以成为我们社区的高级用户! 关注你感兴趣的社区成员 如果你喜欢他们发布的内容,你可以关注社区的任何成员。只需点击任何成员右侧边栏上的 "关注 "按钮,当该成员在社区上发表文章(文章/问题/公告等)时,你将收到电子邮件通知。 此外,在主页的顶部菜单中,你可以点击 "成员",搜索特定的人或有更多意见的成员,或更多的喜欢......并开始关注他们。 关注你感兴趣的标签 用于描述社区上的帖子的所有标签都可以在DC主页上的 "标签 "部分找到: 在DC标签树中, 您可以找到您感兴趣的主题并关注相关的 标签。只需选择一个标签并点击其旁边的 "关注 "按钮即可。当您关注任何标签时,您会收到一封包含所有使用该标签的帖子的电子邮件。 我们建议从以下标签开始: 最佳实践 | 技巧和窍门 | 初学者 | 教程 关注你所感兴趣的帖子 关注一个帖子,你将收到(通过电子邮件)该帖子的所有更新,如新的评论,或如果发表了第二部分,或任何其他与你关注的帖子有关的活动。 要关注一个帖子,你只需要点击每个帖子下面的铃铛图标。 -> 我如何知道我在关注哪些会员、标签和帖子? 要知道你所关注的会员、标签和帖子,你只需要进入你的账户,在右上角 然后进入左栏的 "订阅"。 在这个页面的底部,你可以在三个标签中看到并定制你的订阅--每个标签都显示你所关注的成员、标签和帖子。例如,下面的截图显示,用户正在关注一些标签和DC成员。 注意: 如果你想关注不同语言的会员或标签,你需要将你的订阅设置切换到你感兴趣的语言。 添加帖子到你的书 把你喜欢的帖子加入书签,这样你以后就可以快速而方便地访问该帖子。 如果你喜欢一个帖子(文章、问题或公告)并想把它保存起来,你可以把它添加到你的书签中。这样,你就可以快速和容易地访问该帖子,并在你想要时阅读它。 要将一个帖子添加到你的书签,你只需要点击每个帖子下面的星星图标。 要查看您的所有书签,请进入您的账户,然后在左栏中进入 "书签"。 所以,开发者们! 请使用我们所有的DC功能,这些功能可以帮助你成为InterSystems技术的专家! 而且非常欢迎你在下面的评论中提交关于如何在开发者社区学习InterSystems技术的其他方法和建议。
公告
Claire Zheng · 三月 1, 2021

InterSystems编程大奖赛投票时间:来为最佳App投票!

亲爱的社区开发者们: 本周进入 InterSystems 编程大奖赛 的投票时间! 来为你心目中基于InterSystems IRIS而构建的最佳方案投票吧! 🔥 点击投票 投票入口 🔥 如何投票?有哪些最新信息值得了解一下? 所有社区开发者都可以为自己提交的项目投票——投票将根据用户的Global Master级别自动计入专家提名奖(Experts Nomination)和社区提名奖(Community Nomination)。 所有InterSystems员工都可以为专家提名奖(Experts Nomination)或社区提名奖(Community Nomination)投票。 根据目前的投票引擎和算法,您可以选择三个项目进行投票,选出您心目中的一、二、三名。 以下是社区排行榜说明: 社区(Community)提名投票计分方式: 提名 得分 第一名 3 第二名 2 第三名 1 专家(Experts)提名投票计分会有更复杂的数学计算,不同级别的专家有更多的“点数”权力: 专家(Experts)提名投票计分方式: 级别 提名 第一名 第二名 第三名 VIP级:总经理,版主,产品经理 9 6 3 Global Masters中的专家(Expert)级 6 4 2 Global Masters中的专业(Specialist)级 3 2 1 专家(Experts)提名投票也将为按“3-2-1”为社区排行榜贡献出分数。 投票 1. 登录 Open Exchange – 使用开发者社区的账号即可登录。 2. 在开发者社区进行的任何有效贡献后——回答或提问,写一篇文章,对任何帖子发表评论,您就会看到可用的投票按钮。 如果您改变了主意,可以取消并投票给其他您看中的应用——从3月1日-3月7日,您有七天的时间充分选择! 提醒:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~ ➡️ 请查收最新的 InterSystems在线竞赛投票规则. 还剩三天,北京时间3月8日中午12点截止,请大家抓紧投票! 我会为我欣赏的项目投票! 介绍的很详细,非常感谢!
文章
Michael Lei · 七月 27, 2021

示例:使用默认 REST API 查看 InterSystems IRIS 中的监控指标

以下步骤展示如何显示 `/api/monitor` 服务提供的指标列表示例。 在上个帖子中,我概述了以 Prometheus 格式显示 IRIS 指标的服务。 该贴介绍了如何在容器中设置和运行 [IRIS 预览版 2019.4](https://community.intersystems.com/post/intersystems-iris-and-iris-health-20194-preview-published),然后列出了指标。 本帖假定您已安装 Docker。 如果未安装,现在就为您的平台安装吧 :) ### 步骤 1. 下载并运行 docker 形式的 IRIS 预览版 按照[预览发行版](https://wrc.intersystems.com/wrc/coDistPreview.csp "Preview Distributions")的下载说明下载**预览版许可证密钥**和 **IRIS Docker 映像**。 例如,我选择了 **InterSystems IRIS for Health 2019.4**。 按照 [Docker 容器中的 InterSystems 产品初见](https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers "Run IRIS in a container instructions")中的说明操作。 如果您熟悉容器,请跳转到标题为“**下载 InterSystems IRIS Docker 映像**”的部分。 以下终端输出说明了我用来加载 docker 映像的过程。 docker load 命令可能需要几分钟的时间才能运行; $ pwd /Users/myhome/Downloads/iris_2019.4 $ ls InterSystems IRIS for Health (Container)_2019.4.0_Docker(Ubuntu)_12-31-2019.ISCkey irishealth-2019.4.0.379.0-docker.tar $ docker load -i irishealth-2019.4.0.379.0-docker.tar 762d8e1a6054: Loading layer [==================================================>] 91.39MB/91.39MB e45cfbc98a50: Loading layer [==================================================>] 15.87kB/15.87kB d60e01b37e74: Loading layer [==================================================>] 12.29kB/12.29kB b57c79f4a9f3: Loading layer [==================================================>] 3.072kB/3.072kB b11f1f11664d: Loading layer [==================================================>] 73.73MB/73.73MB 22202f62822e: Loading layer [==================================================>] 2.656GB/2.656GB 50457c8fa41f: Loading layer [==================================================>] 14.5MB/14.5MB bc4f7221d76a: Loading layer [==================================================>] 2.048kB/2.048kB 4db3eda3ff8f: Loading layer [==================================================>] 1.491MB/1.491MB Loaded image: intersystems/irishealth:2019.4.0.379.0 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE intersystems/irishealth 2019.4.0.379.0 975a976ad1f4 3 weeks ago 2.83GB 为简单起见,将密钥文件复制将用于持久性存储的文件夹位置,并重命名为 `iris.key`; $ mkdir -p /Users/myhome/iris/20194 $ cp 'InterSystems IRIS for Health (Container)_2019.4.0_Docker(Ubuntu)_12-31-2019.ISCkey' /Users/myhome/iris/20194/iris.key $ cd /Users/myhome/iris/20194 $ ls iris.key 使用为持久性存储创建的文件夹启动 IRIS; $ docker run --name iris --init --detach --publish 52773:52773 --volume `pwd`:/external intersystems/irishealth:2019.4.0.379.0 --key /external/iris.key $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 009e52c121f0 intersystems/irishealth:2019.4.0.379.0 "/iris-main --key /e…" About a minute ago Up About a minute (healthy) 0.0.0.0:52773->52773/tcp iris 很好! 您现在可以连接到正在运行的容器上的[系统管理门户](http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen "Home SMP")。 我使用的登录名/密码是 _SuperUser/SYS_;您第一次登录时会被提示更改密码。 导航到 Web 应用程序。 `System > Security Management > Web Applications` 您将看到一个 Web 应用程序:`/api/monitor`,这是用于显示 IRIS 指标的服务。 > **您无需执行任何操作即可返回指标,它直接可用。** ### 步骤 2. 预览指标 在以后的帖子中,我们将使用 Prometheus 或 SAM _抓取_此端点,以设置的间隔收集指标。 但现在,让我们看一下为此实例返回的指标的完整列表。 例如,在 Linux 和 OSX 上,一个简单的方法是使用 `curl` 命令发出一个 HTTP GET。 例如,在我的(几乎不活动的)容器上,列表的开头为: $ curl localhost:52773/api/monitor/metrics : : iris_cpu_usage 0 iris_csp_activity{id="127.0.0.1:52773"} 56 iris_csp_actual_connections{id="127.0.0.1:52773"} 8 iris_csp_gateway_latency{id="127.0.0.1:52773"} .588 iris_csp_in_use_connections{id="127.0.0.1:52773"} 1 iris_csp_private_connections{id="127.0.0.1:52773"} 0 iris_csp_sessions 1 iris_cache_efficiency 35.565 : : 等等。 在生产系统上,该列表可能非常长。 我在帖子末尾转储了完整列表。 另一个实用方法是使用 [Postman 应用程序](https://www.getpostman.com "POSTMAN"),但还有其他方法。 假定您已安装适合您的平台的 Postman,则可以发出 HTTP GET 并查看返回的指标。 ## 总结 暂时就这么多内容。 在下个帖子中,我将从收集 _Prometheus_ 中的数据开始,并查看一个 _Grafana_ 仪表板示例。 ### 预览容器中的完整列表 生产系统将提供更多指标。 从一些标签中可以看出,例如 `{id="IRISLOCALDATA"}` ,有一些指标与数据库有关,或者按进程类型对应于 CPU `{id="CSPDMN"}`。 iris_cpu_pct{id="CSPDMN"} 0 iris_cpu_pct{id="CSPSRV"} 0 iris_cpu_pct{id="ECPWorker"} 0 iris_cpu_pct{id="GARCOL"} 0 iris_cpu_pct{id="JRNDMN"} 0 iris_cpu_pct{id="LICENSESRV"} 0 iris_cpu_pct{id="WDSLAVE"} 0 iris_cpu_pct{id="WRTDMN"} 0 iris_cpu_usage 0 iris_csp_activity{id="127.0.0.1:52773"} 57 iris_csp_actual_connections{id="127.0.0.1:52773"} 8 iris_csp_gateway_latency{id="127.0.0.1:52773"} .574 iris_csp_in_use_connections{id="127.0.0.1:52773"} 1 iris_csp_private_connections{id="127.0.0.1:52773"} 0 iris_csp_sessions 1 iris_cache_efficiency 35.850 iris_db_expansion_size_mb{id="ENSLIB"} 0 iris_db_expansion_size_mb{id="HSCUSTOM"} 0 iris_db_expansion_size_mb{id="HSLIB"} 0 iris_db_expansion_size_mb{id="HSSYS"} 0 iris_db_expansion_size_mb{id="IRISAUDIT"} 0 iris_db_expansion_size_mb{id="IRISLOCALDATA"} 0 iris_db_expansion_size_mb{id="IRISSYS"} 0 iris_db_expansion_size_mb{id="IRISTEMP"} 0 iris_db_free_space{id="ENSLIB"} .055 iris_db_free_space{id="HSCUSTOM"} 2.3 iris_db_free_space{id="HSLIB"} 113 iris_db_free_space{id="HSSYS"} 9.2 iris_db_free_space{id="IRISAUDIT"} .094 iris_db_free_space{id="IRISLOCALDATA"} .34 iris_db_free_space{id="IRISSYS"} 6.2 iris_db_free_space{id="IRISTEMP"} 20 iris_db_latency{id="ENSLIB"} 0.030 iris_db_latency{id="HSCUSTOM"} 0.146 iris_db_latency{id="HSLIB"} 0.027 iris_db_latency{id="HSSYS"} 0.018 iris_db_latency{id="IRISAUDIT"} 0.017 iris_db_latency{id="IRISSYS"} 0.020 iris_db_latency{id="IRISTEMP"} 0.021 iris_db_max_size_mb{id="ENSLIB"} 0 iris_db_max_size_mb{id="HSCUSTOM"} 0 iris_db_max_size_mb{id="HSLIB"} 0 iris_db_max_size_mb{id="HSSYS"} 0 iris_db_max_size_mb{id="IRISAUDIT"} 0 iris_db_max_size_mb{id="IRISLOCALDATA"} 0 iris_db_max_size_mb{id="IRISSYS"} 0 iris_db_max_size_mb{id="IRISTEMP"} 0 iris_db_size_mb{id="HSLIB",dir="/usr/irissys/mgr/hslib/"} 1321 iris_db_size_mb{id="HSSYS",dir="/usr/irissys/mgr/hssys/"} 21 iris_db_size_mb{id="ENSLIB",dir="/usr/irissys/mgr/enslib/"} 209 iris_db_size_mb{id="IRISSYS",dir="/usr/irissys/mgr/"} 113 iris_db_size_mb{id="HSCUSTOM",dir="/usr/irissys/mgr/HSCUSTOM/"} 11 iris_db_size_mb{id="IRISTEMP",dir="/usr/irissys/mgr/iristemp/"} 21 iris_db_size_mb{id="IRISAUDIT",dir="/usr/irissys/mgr/irisaudit/"} 1 iris_db_size_mb{id="IRISLOCALDATA",dir="/usr/irissys/mgr/irislocaldata/"} 1 iris_directory_space{id="HSLIB",dir="/usr/irissys/mgr/hslib/"} 53818 iris_directory_space{id="HSSYS",dir="/usr/irissys/mgr/hssys/"} 53818 iris_directory_space{id="ENSLIB",dir="/usr/irissys/mgr/enslib/"} 53818 iris_directory_space{id="IRISSYS",dir="/usr/irissys/mgr/"} 53818 iris_directory_space{id="HSCUSTOM",dir="/usr/irissys/mgr/HSCUSTOM/"} 53818 iris_directory_space{id="IRISTEMP",dir="/usr/irissys/mgr/iristemp/"} 53818 iris_directory_space{id="IRISAUDIT",dir="/usr/irissys/mgr/irisaudit/"} 53818 iris_disk_percent_full{id="HSLIB",dir="/usr/irissys/mgr/hslib/"} 10.03 iris_disk_percent_full{id="HSSYS",dir="/usr/irissys/mgr/hssys/"} 10.03 iris_disk_percent_full{id="ENSLIB",dir="/usr/irissys/mgr/enslib/"} 10.03 iris_disk_percent_full{id="IRISSYS",dir="/usr/irissys/mgr/"} 10.03 iris_disk_percent_full{id="HSCUSTOM",dir="/usr/irissys/mgr/HSCUSTOM/"} 10.03 iris_disk_percent_full{id="IRISTEMP",dir="/usr/irissys/mgr/iristemp/"} 10.03 iris_disk_percent_full{id="IRISAUDIT",dir="/usr/irissys/mgr/irisaudit/"} 10.03 iris_ecp_conn 0 iris_ecp_conn_max 2 iris_ecp_connections 0 iris_ecp_latency 0 iris_ecps_conn 0 iris_ecps_conn_max 1 iris_glo_a_seize_per_sec 0 iris_glo_n_seize_per_sec 0 iris_glo_ref_per_sec 7 iris_glo_ref_rem_per_sec 0 iris_glo_seize_per_sec 0 iris_glo_update_per_sec 2 iris_glo_update_rem_per_sec 0 iris_journal_size 2496 iris_journal_space 50751.18 iris_jrn_block_per_sec 0 iris_jrn_entry_per_sec 0 iris_jrn_free_space{id="WIJ",dir="default"} 50751.18 iris_jrn_free_space{id="primary",dir="/usr/irissys/mgr/journal/"} 50751.18 iris_jrn_free_space{id="secondary",dir="/usr/irissys/mgr/journal/"} 50751.18 iris_jrn_size{id="WIJ"} 100 iris_jrn_size{id="primary"} 2 iris_jrn_size{id="secondary"} 0 iris_license_available 31 iris_license_consumed 1 iris_license_percent_used 3 iris_log_reads_per_sec 5 iris_obj_a_seize_per_sec 0 iris_obj_del_per_sec 0 iris_obj_hit_per_sec 2 iris_obj_load_per_sec 0 iris_obj_miss_per_sec 0 iris_obj_new_per_sec 0 iris_obj_seize_per_sec 0 iris_page_space_per_cent_used 0 iris_phys_mem_per_cent_used 95 iris_phys_reads_per_sec 0 iris_phys_writes_per_sec 0 iris_process_count 29 iris_rtn_a_seize_per_sec 0 iris_rtn_call_local_per_sec 10 iris_rtn_call_miss_per_sec 0 iris_rtn_call_remote_per_sec 0 iris_rtn_load_per_sec 0 iris_rtn_load_rem_per_sec 0 iris_rtn_seize_per_sec 0 iris_sam_get_db_sensors_seconds .000838 iris_sam_get_jrn_sensors_seconds .001024 iris_system_alerts 0 iris_system_alerts_new 0 iris_system_state 0 iris_trans_open_count 0 iris_trans_open_secs 0 iris_trans_open_secs_max 0 iris_wd_buffer_redirty 0 iris_wd_buffer_write 0 iris_wd_cycle_time 0 iris_wd_proc_in_global 0 iris_wd_size_write 0 iris_wd_sleep 10002 iris_wd_temp_queue 42 iris_wd_temp_write 0 iris_wdwij_time 0 iris_wd_write_time 0 iris_wij_writes_per_sec 0
公告
Claire Zheng · 八月 11, 2022

网络研讨会:使用ECP在AWS上扩展 InterSystems FHIR Server

Hi 社区成员们, 我们很高兴地宣告 社区网络研讨会 回归了! 我们诚邀您参加 @sween 主讲的 使用ECP在AWS上扩展InterSystems FHIR Server 网络研讨会。 Join this webinar to make a technical deep dive, see a demonstration, and benchmark horizontal scaling InterSystems FHIR Server on Amazon Web Services with Enterprise Cache Protocol (ECP). 欢迎加入此次网络研讨会,深入了解技术,观看演示,并在AWS上使用企业缓存协议(ECP)基准测试水平扩展InterSystems FHIR Server。 ⏱ 时间: 8月18日(周四)8am (美国东部时间) | 2:00pm (中欧夏季时间)| 8:00pm (北京时间)👨‍🏫 主讲人: @sween, 全栈架构师,来自Integration Required 关于 Integration Required: 我们是一个针对InterSystems®工作负载的全栈技术交付团队,可根据您的安全状况和组织部署标准进行定制。凭借InterSystems®十年的合作伙伴关系和对客户满意度的严格坚持,客户对我们充满信任,我们能够实现最佳实践。 那么,不要错过这次机会!来了解更多关于扩展FHIR、ECP和AWS的知识吧! Don't miss this opportunity to learn more about scaling FHIR, ECP and AWS and how to mix it all! >> 点击注册 <<
文章
Jingwei Wang · 十月 28, 2021

IRIS 2021 技术文档 First Look 26 InterSystems API 管理器

html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; } .mac-os-11 { --title-bar-height: 28px; } html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; } body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit; background-repeat: inherit; } iframe { margin: auto; } a.url { word-break: break-all; } a:active, a:hover { outline: 0px; } .in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); } #write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; } #write.first-line-indent p { text-indent: 2em; } #write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; } #write.first-line-indent li { margin-left: 2em; } .for-image #write { padding-left: 8px; padding-right: 8px; } body.typora-export { padding-left: 30px; padding-right: 30px; } .typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; } .typora-export .task-list-item input { pointer-events: none; } @media screen and (max-width: 500px) { body.typora-export { padding-left: 0px; padding-right: 0px; } #write { padding-left: 20px; padding-right: 20px; } .CodeMirror-sizer { margin-left: 0px !important; } .CodeMirror-gutters { display: none !important; } } #write li > figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max-width: 100%; vertical-align: middle; image-orientation: from-image; } button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; } input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; } *, ::after, ::before { box-sizing: border-box; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; } p { line-height: inherit; } h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; } p { orphans: 4; } h1 { font-size: 2rem; } h2 { font-size: 1.8rem; } h3 { font-size: 1.6rem; } h4 { font-size: 1.4rem; } h5 { font-size: 1.2rem; } h6 { font-size: 1rem; } .md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; } .hidden { display: none; } .md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; } a { cursor: pointer; } sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; } sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; } #write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; } figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; } figure > table { margin: 0px; } tr { break-inside: avoid; break-after: auto; } thead { display: table-header-group; } table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; } table.md-table td { min-width: 32px; } .CodeMirror-gutters { border-right-width: 0px; background-color: inherit; } .CodeMirror-linenumber { } .CodeMirror { text-align: left; } .CodeMirror-placeholder { opacity: 0.3; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-lines { padding: 0px; } div.hr:focus { cursor: none; } #write pre { white-space: pre-wrap; } #write.fences-no-line-wrapping pre { white-space: pre; } #write pre.ty-contain-cm { white-space: normal; } .CodeMirror-gutters { margin-right: 4px; } .md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit; background-repeat: inherit; } .md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; } #write .md-fences.mock-cm { white-space: pre-wrap; } .md-fences.md-fences-with-lineno { padding-left: 0px; } #write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; } .md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; } .CodeMirror-line, twitterwidget { break-inside: avoid; } .footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; } .footnotes + .footnotes { margin-top: 0px; } .md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; } li div { padding-top: 0px; } blockquote { margin: 1rem 0px; } li .mathjax-block, li p { margin: 0.5rem 0px; } li blockquote { margin: 1rem 0px; } li { margin: 0px; position: relative; } blockquote > :last-child { margin-bottom: 0px; } blockquote > :first-child, li > :first-child { margin-top: 0px; } .footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; } #write .footnote-line { white-space: pre-wrap; } @media print { body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; } #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; } .typora-export * { -webkit-print-color-adjust: exact; } .typora-export #write { break-after: avoid; } .typora-export #write::after { height: 0px; } .is-mac table { break-inside: avoid; } .typora-export-show-outline .typora-export-sidebar { display: none; } } .footnote-line { margin-top: 0.714em; font-size: 0.7em; } a img, img a { cursor: pointer; } pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; } p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; } #write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; } p > .md-image:only-child { display: inline-block; width: 100%; } #write .MathJax_Display { margin: 0.8em 0px 0px; } .md-math-block { width: 100%; } .md-math-block:not(:empty)::after { display: none; } .MathJax_ref { fill: currentcolor; } [contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; } .md-task-list-item { position: relative; list-style-type: none; } .task-list-item.md-task-list-item { padding-left: 0px; } .md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; } .math { font-size: 1rem; } .md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; } .md-toc-content { position: relative; margin-left: 0px; } .md-toc-content::after, .md-toc::after { display: none; } .md-toc-item { display: block; color: rgb(65, 131, 196); } .md-toc-item a { text-decoration: none; } .md-toc-inner:hover { text-decoration: underline; } .md-toc-inner { display: inline-block; cursor: pointer; } .md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; } .md-toc-h2 .md-toc-inner { margin-left: 2em; } .md-toc-h3 .md-toc-inner { margin-left: 4em; } .md-toc-h4 .md-toc-inner { margin-left: 6em; } .md-toc-h5 .md-toc-inner { margin-left: 8em; } .md-toc-h6 .md-toc-inner { margin-left: 10em; } @media screen and (max-width: 48em) { .md-toc-h3 .md-toc-inner { margin-left: 3.5em; } .md-toc-h4 .md-toc-inner { margin-left: 5em; } .md-toc-h5 .md-toc-inner { margin-left: 6.5em; } .md-toc-h6 .md-toc-inner { margin-left: 8em; } } a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } .footnote-line a:not(.reversefootnote) { color: inherit; } .md-attr { display: none; } .md-fn-count::after { content: "."; } code, pre, samp, tt { font-family: var(--monospace); } kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; } .md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); } code { text-align: left; } a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; } .md-inline-math .MathJax_SVG .noError { display: none !important; } .html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; } .md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; } .MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; } .MathJax_SVG .MJX-monospace { font-family: var(--monospace); } .MathJax_SVG .MJX-sans-serif { font-family: sans-serif; } .MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; zoom: 90%; } #math-inline-preview-content { zoom: 1.1; } .MathJax_SVG * { transition: none; } .MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; } .os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; } .md-diagram-panel > svg { max-width: 100%; } [lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; } [lang="mermaid"] .node text { font-size: 1rem; } table tr th { border-bottom-width: 0px; } video { max-width: 100%; display: block; margin: 0px auto; } iframe { max-width: 100%; width: 100%; border: none; } .highlight td, .highlight tr { border: 0px; } mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); } .md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; } .md-expand mark .md-meta { opacity: 0.3 !important; } mark .md-meta { color: rgb(0, 0, 0); } @media print { .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; } } .md-diagram-panel .messageText { stroke: none !important; } .md-diagram-panel .start-state { fill: var(--node-fill); } .md-diagram-panel .edgeLabel rect { opacity: 1 !important; } .md-require-zoom-fix foreignObject { font-size: var(--mermaid-font-zoom); } .md-fences.md-fences-math { font-size: 1em; } .md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; } .md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; } .md-fences-advanced:not(.md-focus) { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; } .typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; } .typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; } .typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; } @media screen and (max-width: 1024px) { .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; } } @media screen and (max-width: 800px) { .typora-export-sidebar { display: none; } } .outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; } .outline-content ul { margin-top: 0px; margin-bottom: 0px; } .outline-content strong { font-weight: 400; } .outline-expander { width: 1rem; height: 1.428571429rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; } .outline-expander::before { content: ''; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; } .outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; } .outline-expander:hover::before { content: ''; } .outline-h1 > .outline-item { padding-left: 0px; } .outline-h2 > .outline-item { padding-left: 1em; } .outline-h3 > .outline-item { padding-left: 2em; } .outline-h4 > .outline-item { padding-left: 3em; } .outline-h5 > .outline-item { padding-left: 4em; } .outline-h6 > .outline-item { padding-left: 5em; } .outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; } .outline-label:hover { text-decoration: underline; } .outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); } .outline-item:hover { margin-left: -28px; margin-right: -28px; border-left-width: 28px; border-left-style: solid; border-left-color: transparent; border-right-width: 28px; border-right-style: solid; border-right-color: transparent; } .outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; } .outline-item-open > .outline-item > .outline-expander::before { content: ''; } .outline-children { display: none; } .info-panel-tab-wrapper { display: none; } .outline-item-open > .outline-children { display: block; } .typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; } .typora-export .outline-item:hover { margin-right: -8px; border-right-width: 8px; border-right-style: solid; border-right-color: transparent; } .typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; } .typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: '−'; } .typora-export-collapse-outline .outline-children { display: none; } .typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; } .typora-export-no-collapse-outline .outline-expander::before { content: "" !important; } .typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; } :root { --side-bar-bg-color: #fafafa; --control-text-color: #777; } @include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext); /* open-sans-regular - latin-ext_latin */ /* open-sans-italic - latin-ext_latin */ /* open-sans-700 - latin-ext_latin */ /* open-sans-700italic - latin-ext_latin */ html { font-size: 16px; } body { font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 1.6; } #write { max-width: 860px; margin: 0 auto; padding: 30px; padding-bottom: 100px; } @media only screen and (min-width: 1400px) { #write { max-width: 1024px; } } @media only screen and (min-width: 1800px) { #write { max-width: 1200px; } } #write > ul:first-child, #write > ol:first-child{ margin-top: 30px; } a { color: #4183C4; } h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; } h1 tt, h1 code { font-size: inherit; } h2 tt, h2 code { font-size: inherit; } h3 tt, h3 code { font-size: inherit; } h4 tt, h4 code { font-size: inherit; } h5 tt, h5 code { font-size: inherit; } h6 tt, h6 code { font-size: inherit; } h1 { font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee; } h2 { font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee; } /*@media print { .typora-export h1, .typora-export h2 { border-bottom: none; padding-bottom: initial; } .typora-export h1::after, .typora-export h2::after { content: ""; display: block; height: 100px; margin-top: -96px; border-top: 1px solid #eee; } }*/ h3 { font-size: 1.5em; line-height: 1.43; } h4 { font-size: 1.25em; } h5 { font-size: 1em; } h6 { font-size: 1em; color: #777; } p, blockquote, ul, ol, dl, table{ margin: 0.8em 0; } li>ol, li>ul { margin: 0 0; } hr { height: 2px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none; overflow: hidden; box-sizing: content-box; } li p.first { display: inline-block; } ul, ol { padding-left: 30px; } ul:first-child, ol:first-child { margin-top: 0; } ul:last-child, ol:last-child { margin-bottom: 0; } blockquote { border-left: 4px solid #dfe2e5; padding: 0 15px; color: #777777; } blockquote blockquote { padding-right: 0; } table { padding: 0; word-break: initial; } table tr { border: 1px solid #dfe2e5; margin: 0; padding: 0; } table tr:nth-child(2n), thead { background-color: #f8f8f8; } table th { font-weight: bold; border: 1px solid #dfe2e5; border-bottom: 0; margin: 0; padding: 6px 13px; } table td { border: 1px solid #dfe2e5; margin: 0; padding: 6px 13px; } table th:first-child, table td:first-child { margin-top: 0; } table th:last-child, table td:last-child { margin-bottom: 0; } .CodeMirror-lines { padding-left: 4px; } .code-tooltip { box-shadow: 0 1px 1px 0 rgba(0,28,36,.3); border-top: 1px solid #eef2f2; } .md-fences, code, tt { border: 1px solid #e7eaed; background-color: #f8f8f8; border-radius: 3px; padding: 0; padding: 2px 4px 0px 4px; font-size: 0.9em; } code { background-color: #f3f4f4; padding: 0 2px 0 2px; } .md-fences { margin-bottom: 15px; margin-top: 15px; padding-top: 8px; padding-bottom: 6px; } .md-task-list-item > input { margin-left: -1.3em; } @media print { html { font-size: 13px; } table, pre { page-break-inside: avoid; } pre { word-wrap: break-word; } } .md-fences { background-color: #f8f8f8; } #write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border: 0; border-radius: 3px; color: #777777; margin-top: 0 !important; } .mathjax-block>.code-tooltip { bottom: .375rem; } .md-mathjax-midline { background: #fafafa; } #write>h3.md-focus:before{ left: -1.5625rem; top: .375rem; } #write>h4.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h5.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h6.md-focus:before{ left: -1.5625rem; top: .285714286rem; } .md-image>.md-meta { /*border: 1px solid #ddd;*/ border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; } .md-tag { color: #a7a7a7; opacity: 1; } .md-toc { margin-top:20px; padding-bottom:20px; } .sidebar-tabs { border-bottom: none; } #typora-quick-open { border: 1px solid #ddd; background-color: #f8f8f8; } #typora-quick-open-item { background-color: #FAFAFA; border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee; border-style: solid; border-width: 1px; } /** focus mode */ .on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); } header, .context-menu, .megamenu-content, footer{ font-family: "Segoe UI", "Arial", sans-serif; } .file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state{ visibility: visible; } .mac-seamless-mode #typora-sidebar { background-color: #fafafa; background-color: var(--side-bar-bg-color); } .md-lang { color: #b4654d; } /*.html-for-mac { --item-hover-bg-color: #E6F0FE; }*/ #md-notification .btn { border: 0; } .dropdown-menu .divider { border-color: #e5e5e5; opacity: 0.4; } .ty-preferences .window-content { background-color: #fafafa; } .ty-preferences .nav-group-item.active { color: white; background: #999; } .menu-item-container a.menu-style-btn { background-color: #f5f8fa; background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); } :root {--mermaid-font-zoom:1em ;} @media print { @page {margin: 0 0 0 0;} body.typora-export {padding-left: 0; padding-right: 0;} #write {padding:0;}} 目录 技术概要:InterSystems API 管理器InterSystems API管理器是如何工作的?试一试!在 InterSystems IRIS 中设置 REST API 在 IAM 中为您的 REST API 创建服务在 IAM 中创建路由 从 REST 客户端调用您的 API添加速率限制插件添加您的 REST 规范到 IAM了解有关 InterSystems API Manager 的更多信息 技术概要:InterSystems API 管理器 本文档将向您介绍InterSystems API管理器(InterSystems API Manager ,IAM),解释了它的工作原理,并让您开始在自己的实例上探索它的功能。 InterSystems API管理器是如何工作的? InterSystems API管理器是 InterSystems IRIS®数据平台的一个组件,它允许您利用由 InterSystems IRIS 应用程序暴露或消费的微服务和 API。作为 InterSystems IRIS的 服务器和应用程序之间的 API 网关(gateway),API 管理器使您能够更有效地监视和控制服务器端 API 和客户端应用程序之间的调用流量。 要了解有关 InterSystems API管理器的更多信息,您可以观看这个概述视频。 试一试! InterSystems API管理器(InterSystems API Manager ,IAM)是与 InterSystems IRIS 实例分开安装的。要获得自己的 IAM 安装包,您可以从 InterSystems WRC 软件分发(Software Distribution)网站下载 ,或者联系您的 InterSystems 销售工程师。安装包包括一个脚本(iam-setup),用于设置 IAM 并将它与您的 InterSystems IRIS 实例连接。 这个练习假定您有 InterSystems IRIS 和 IAM 的实例,并且已经运行了安装脚本来连接它们。本练习使用 IAM 2.3 版本进行展示。 在 InterSystems IRIS 中设置 REST API 从位于 https://github.com/intersystems/FirstLook-IAM 的 GitHub 存储库中,将以下内容导入 InterSystems IRIS: /cls/cmAPI 包括使用 API 管理服务生成的三个类文件,以及一个coffeemaker对象定义: impl.cls disp.cls spec.cls coffeemaker.cls 要导入,请打开 InterSystems IRIS 管理门户(Management Portal),并导航到 Classes 页面(System Explorer(系统资源管理器) > Classes(类));如果您不在 USER 命名空间中,请使用左边的选择器来更改为它,如下图所示: 选择上面列出的四个类并点击 Import(导入)。这将 REST API 导入 InterSystems IRIS,同时导入相应的类,应用程序将使用这些类访问存储在数据库中的coffermakers集合。 /gbl/coffeemakers.gof。 通过进入管理门户(Management Portal),并点击 System Explorer(系统资源管理器)> Globals > Import(导入)来导入。查找 coffeemakers.gof。导入到 User.cmAPI.coffeemaker 模式。 接下来,设置一个 Web 应用程序(Web Application),指向您刚刚导入的 REST 类。Web 应用程序层为自定义和安全提供了额外的机会。在管理门户(Management Portal)中,选择 System Administration(系统管理) > Security(安全) > Applications(应用程序)> Web Applications(Web 应用程序)。点击 Create New Web Application(新建Web 应用程序) 并填写以下设置: Name(名称): /rest/coffeemakerapp Namespace(命名空间): USER Enable Application(启用应用程序):选中此复选框 Enable(启用):选择 REST Dispatch Class(分派类): cmAPI.disp 安全设置 - Allowed Authentication Methods(允许的身份认证方法): Unauthenticated ,Password 在 IAM 中为您的 REST API 创建服务 正如您在 IAM 概述视频中所看到的,在 IAM 工作流中,有三个主要组件在发挥作用------消费者(Consumers)、路由(Route)和服务(Service)。IAM 中的服务是为您存在于 InterSystems IRIS 中的 API 创建的。在这种情况下,我们将为您的coffeemaker API 创建一个服务。 您从 WRC 下载的 IAM 包还包括一个脚本(iam-test),用于设置示例服务和路由。如果您运行了这个脚本,您将能够查看 test-iris 服务。 我们将取得类似的结果,使用 IAM 门户添加您的Coffeemakers服务。 iam-setup.sh是用来启动 IAM 的,可以通过输入iam-setup.sh 脚本中指定的门户的 URL 来启动 IAM 管理门户(management portal)。默认情况下,URL 是: http://localhost:8002 选择 default Workspace(默认工作区)。如果默认工作区不可见,而且管理门户(Management Portal)似乎是空的,那么可能是您没有输入 iam-setup.sh 定义的确切 URL。 选择 API Gateway(API 网关) 中的 Services(服务),并选择 New Service(新的服务)。请按以下方式填写表格: Name(名称): 咖啡机服务(CoffeemakerService) 选择 Add using Protocol, Host and Path(添加使用协议、主机和路径) Protocol(协议): http Host(主机):[插入您的 InterSystems IRIS 实例的 IP 地址。为避免 DNS 问题,使用 IP 地址的数字形式。] Path(路径): /rest/coffeemakerapp Port(端口): [插入您的实例的 webserver 端口,默认为 52773,或者如果实例是在容器中,您已经映射到 web 服务器(webserver) 端口的主机端口] 不要选择"查看 6 个高级字段(View 6 Advanced Fields)"。 选择 Create(创建)。 一旦创建了服务,您就可以查看服务,并需要创建路由。 在 IAM 中创建路由 当您在查看服务时,选择 "添加路由(Add a Route)"。请按以下方式填写表格: Sevice(服务):此字段已正确地用服务的十六进制的 ID 初始化。 Name(名称): 可以留空 Protocols(协议):http Hosts(主机): 可以留空 Methods(方法):GET、POST、PUT、DELETE Paths(路径):select(选择) "+添加路径(Add Path)"并输入 /rest/coffeemakerapp Headers(标题): 可以留空 HTTPS Redirect Status Code(HTTPS 重定向状态代码): 426(这是默认值) Tags(标签): 可以留空 不要选择 "查看 4 个高级字段(View 4 Advanced Fields)"。 选择 Create(创建)。 一旦创建了路由,您将通过从 REST 客户端进行简单的 API 调用来测试您的路由和服务。 从 REST 客户端调用您的 API 使用 REST 客户端------可以使用Postman 或来自 Google Chrome 的高级 REST 客户端(Advanced REST Client)------在 InterSystems IRIS 中对您的咖啡机(Coffeemakers) API 进行一个简单的 API 调用。要做到这一点,创建一个请求 URL,其中包括您的 IAM 实例的 IP 地址和端口号,以及您的服务的路径和请求的端点。请务必使用用户名和密码授权您的请求。下面是一个示例;注意,默认情况下,IAM 处理 8000 端口上的代理请求。例如: POST http://localhost:8000/rest/coffeemakerapp/coffeemakers 一旦您成功地进行了调用,您可以导航回您的 IAM 仪表板(Dashboard),查看来自所进行的调用的统计数据和其他信息。从这个仪表板上,您可以看到许多不同的信息集,这些信息将帮助您监控和控制客户端应用程序和 InterSystems IRIS 内的服务之间的流量。 添加速率限制插件 有效地监测您的 API 流量是有益的,但仅限于使用该信息适当地控制和优化流量。IAM 使您能够使用一些不同的插件来提高您控制客户端和 API 之间流量的能力。 在 IAM 管理门户(Management Portal)中,选择 API Gateway(API 网关) 中的 Plugins(插件) ,并选择 New Plugin(新的插件)。在 Traffic Control(流量控制) 类别中,找到 Rate Limiting(速率限制) 插件,并选择 Enable(启用)。 在这个插件的配置屏幕上: 选择 Scoped(范围)。 在 Service(服务) 中选择咖啡机服务(CoffeeMakerService)。 试一试! 其他大部分字段保留它们的默认值,但将 Config.Limit By 设置为服务(Service),将 Config.Minute 设置为 5。 这将限制所有消费者每分钟只能调用 5 次服务中所有路由。 选择 Create(创建)。 您可以通过返回 REST 客户端并进行示例调用来测试这个速率限制插件。客户端超过限制后,它将得到一个 429 返回错误,并带有"超过 API 速率限制"的信息 添加您的 REST 规范到 IAM REST 开发的最佳实践方法是规范优先,因此很可能您已经有了自己的 REST 规范。对于这个练习,您可以使用您从 github 下载 FirstLook-IAM 存储库时,spec 目录下的 swagger_100419.json 文件。您也可以直接从 GitHub 存储库的 spec 文件夹中下载 JSON 规范。 https://github.com/intersystems/FirstLook-IAM/blob/master/spec/swagger_100419.json 注意: 有关记录和管理 REST API 规范的更多信息,请参见 Creating REST Services(《创建 REST 服务》)中的 Discovering and Documenting REST APIs(发现和记录 REST API)。 一旦下载,您就能将您的规范添加到 IAM 中: 从 IAM 管理门户(management portal),选择 Workspaces(工作区) 标签并选择默认工作区。 为咖啡机服务(CoffeemakerService)服务选择 View(查看)。 在 Documents(文档) 区域(面板的底部)选择 Add a document(添加一个文档)到这个服务。 点击下面的文件选择器文本框 Or upload a new spec instead...(或者上传一个新的规范代替...) ,然后选择您下载的 swagger_100419.json 文件。 您现在可以查看咖啡机服务(CoffeemakerService)的 OpenAPI 规范。外部开发者也可以访问这个规范,这允许他们开发对它的 REST 调用。由于 curl 命令没有指定正确的服务,所以 "试一试(Try it Out)"选项将无法工作。 了解有关 InterSystems API管理器 的更多信息 注意: 如果没有设置默认的开发门户(dev portal),选择 Set up Dev Portal(设置开发门户)。如果默认的开发门户(Dev Portal)被禁用,选择 Enable Developer Portal(启用开发门户)。它可能需要几分钟的时间来设置。 了解有关 InterSystems API Manager 的更多信息 InterSystems 提供了一些参考资料来了解有关 IAM 的更多信息: API Manager Introduction(《API Manager 介绍》) (演示) What is InterSystems API管理器?(《什么是 InterSystems API管理器?》)(视频) IAM Guide(《IAM 指南》) (文档) 如果您想了解有关如何开发咖啡机服务(CoffeemakerService) REST 服务的更多详细信息,请参见 《技术概要:在 InterSystems 产品中开发 REST 接口》。
文章
Louis Lu · 九月 26, 2021

IRIS 2021 技术文档 First Look 10 -- InterSystems .Net 网关

本技术概要( First Look)通过重点概述和一个基础的、实际操作的示例,向您介绍在 InterSystems IRIS®数据平台上使用 .NET 网关(Gateway)的基础知识。您将了解 InterSystems IRIS 如何与 .NET 程序集进行互操作,在这个示例中,您将创建一个 .NET 网关(Gateway),并从 InterSystems IRIS 中的代理类调用基础 DLL。 本文档设计简单;当您把 .NET 网关(Gateway)引入您的生产系统时,您可能需要做一些不同的事情。本文档末尾的参考资料,提供了有关在生产中使用 .NET 网关(Gateway)的详细和完整的信息。 要浏览所有的技术概要(First Look),包括其他可以在免费的云实例或 web 实例上执行的技术概要(First Look),请参见 InterSystems First Looks(InterSystems 技术概要)。 1. 为什么 .NET 网关(Gateway)很重要 InterSystems IRIS Object Gateway for .NET(也称为".NET 网关(Gateway)")为InterSystems IRIS 与 Microsoft .NET Framework 组件进行互操作提供了一种简便的方法。在使用网关(Gateway)导入 .NET DLL 后,您可以实例化一个外部 .NET 对象,InterSystems IRIS通过代理类将其作为的一个本地对象来操作。 每个代理对象(proxy object)都与相应的 .NET 对象通信,使您能够从 InterSystems IRIS 和 ObjectScript 中访问您的 .NET 类和方法。调用任何 InterSystems IRIS 代理方法都会将消息发送给 .NET 网关(Gateway) 工作线程,该线程会找到合适的方法或构造函数调用。调用的结果发送回代理对象,再将结果返回给 InterSystems IRIS 应用程序。 通常,使用 .NET 网关(Gateway)的最佳方法是在您的应用程序中为第三方 DLL 构建一个小型包装器类(a small wrapper class),然后为包装器生成代理类。包装器类只公开您想要的功能,而不是创建大量应用程序可能不需要的代理类。 2. 探索 .NET 网关(Gateway) 在这个实际操作的示例中,您将: 创建一个 DLL,其中包含要从 InterSystems IRIS 调用的示例类 定义一个 .NET 网关(Gateway),并启动服务器进程 创建一个 ObjectScript 类,从 DLL 生成代理类 创建另一个 ObjectScript 类,以连接到网关(Gateway)并通过代理对象操作 DLL 想试试 InterSystems IRIS .NET 开发和互操作性功能的在线视频演示吗?请看.NET QuickStart(.NET 快速入门)! 2.1 用前须知 要运行这个演示,您需要一个运行 Microsoft .NET Framework 4.5 版本 的 Windows 10 系统、Visual Studio,以及一个已安装的 InterSystems IRIS 实例。(有关安装 InterSystems IRIS 的说明,请参见 InterSystems IRIS Basics:Installation [《InterSystems IRIS 基础:安装》]。) 有关配置 Visual Studio 以连接到您的 InterSystems IRIS 实例的说明,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础: 连接一个 IDE》)中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)和 .Net IDE。 您还将使用InterSystems 的 Studio IDE(一个在 Windows 系统上运行的客户端应用程序)来创建 ObjectScript 代码;更多信息,请参见InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础: 连接一个 IDE》)中的 Using Studio(使用 Studio) 和 Studio。 )​​​​​​ 2.2 创建 DLL 使用 Visual Studio,创建一个名为 Person 的类并复制以下 C# 代码。在本例中使用 .NET 4.5。 public class Person { public int age; public String name; //constructor public Person (int startAge, String Name) { age = startAge; name = Name; } public void setAge(int newAge) { age = newAge; } public String getName() { return name; } public int getAge() { return age; } public static void main(String []args) { Person myPerson = new Person (5, "Tom"); Console.Out.WriteLine(myPerson.getName()); Console.Out.WriteLine(myPerson.getAge()); } } 编译 Person 类,并生成一个 Person.dll 文件。注意 DLL 的位置,因为您稍后会需要它。 2.3 创建并启动 .NET 网关 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础: 连接一个 IDE》)中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)描述的 URL,在浏览器中打开您的实例的管理门户(Management Portal)。 导航至 System Administration(系统管理) > Configuration(配置) > Connectivity(连接) > External Language Servers(外部语言服务)。 选择 Create External Language Server(创建外部语言服务)。 输入 Server Name(网关名称)。 在 Server Type (服务类型)中选择 .Net 在 Port(端口)字段中,输入 55000。 对于 .NET Version(.NET 版本),请选择 4.5。 选择 Save(保存)。 在External Language Servers(外部语言服务)页面,找到您刚刚定义的网关(Gateway),并选择 Start(开始) 2.4 生成代理类 使用 Studio, 在实例的 USER 命名空间中创建一个名为 CreateProxyClasses.cls 的新 ObjectScript 类,并粘贴以下代码, 将您的实例的主机标识符替换为 gwyConn.%Connect 中的 server,并用双引号括起来的 Person.dll 文件的完整文件路径替换 YOUR FILEPATH HERE。 Class User.CreateProxyClasses Extends %Persistent { ClassMethod run() { // get a connection to the .NET Gateway set gwyConn = ##class(%Net.Remote.Gateway).%New() set status = gwyConn.%Connect("127.0.0.1", 55000, "USER") if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } // add the DLL to the classpath set classpath = ##class(%ListOfDataTypes).%New() do classpath.Insert("YOUR FILEPATH HERE") set status = gwyConn.%AddToCurrentClassPath(classpath) if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } // create the proxy ObjectScript classes corresponding to the .NET classes in the DLL set status = gwyConn.%Import("Person",,,,1) if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } //close the connection to the .NET Gateway set status = gwyConn.%Disconnect() if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } } } 编译并构建该类。然后使用 InterSystems IRIS Basics:Connecting an IDE(InterSystems IRIS 基础: 连接一个 IDE) 中的 instructions for your instance(对您的实例的说明),在 USER 命名空间中打开 InterSystems 终端(InterSystems Terminal), 并执行以下命令: do ##class(User.CreateProxyClasses).run() 2.5 使用ObjectScript 操作 .NET Object 在 USER 命名空间中创建另一个名为 ManipulateObjects.cls 的 ObjectScript 类,并粘贴以下代码 (注意要将您的实例的主机标识符替换 gwyConn.%Connect 中的 第一个参数): Class User.ManipulateObjects Extends %Persistent { ClassMethod run() { // get a connection to the .NET gateway set gwyConn = ##class(%Net.Remote.Gateway).%New() set status = gwyConn.%Connect("127.0.0.1", 55000, "USER") if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } // manipulate some proxy objects set person = ##class(User.Person).%New(gwyConn,5,"Tom") write !,"Name: "_person.getName() write !,"Age: "_person.getAge() do person.setAge(100) write !,"Age: "_person.getAge() // close the connection to the .NET gateway set status = gwyConn.%Disconnect() if $$$ISERR(status) { write !,"error: "_$system.OBJ.DisplayError(status) quit } } } 编译并构建该类,然后在终端(Terminal)中的 USER 命名空间中执行以下命令: do ##class(User.ManipulateObjects).run() 您应该可以看到以下输出: Name: Tom Age: 5 setting age to 100 Age: 100 现在您已经成功地完成了练习,停止您创建的 .NET 网关(Gateway)。返回到管理门户(Management Portal)中的 External Language Servers(外部语言服务)页面,找到网关(Gateway),并选择 Stop(停止)。 3. 了解更多有关 .NET 网关(Gateway)的信息 从这里,您可以继续探索 .NET 网关(Gateway)和 InterSystems IRIS。请参阅下面的文档和参考资料,了解 .NET、互操作性、应用程序开发等。 Using the Gateway for .NET(使用 .NET 网关) — 了解更多有关 InterSystems IRIS 和 Microsoft .NET Framework 组件之间互操作性的信息。 Skyrocket Your .NET Application Development(Skyrocket Your .NET 应用程序开发) — 这是 InterSystems 关于在 .NET 中作为对象建模和访问数据的演示。 .NET Documentation(.NET 文档) — Microsoft 在 .NET 上的文档,包括架构概念、教程和开发指南。