搜索​​​​

清除过滤器
公告
jieliang liu · 六月 15, 2021

InterSystems IRIS、IRIS for Health和HealthShare Health Connect 2021.1现已正式发布。

InterSystems非常高兴地宣布,InterSystems IRIS数据平台、InterSystems IRIS for Health和HealthShare Health Connect的2021.1版本现已向我们的客户和合作伙伴全面开放。 这个版本的为开发者提供了更大的自由度,使他们可以用自己选择的编程语言在服务器端和客户端建立快速和强大的应用程序。这个版本还使用户能够通过新的和更快的分析能力更有效地消费大量的信息。 我们期望许多客户和合作伙伴将他们的Caché和Ensemble部署升级到InterSystems的IRIS版本,并尽一切努力使之成为一个平稳和值得的过渡。大多数应用程序在IRIS上运行后会立即看到性能上的好处,甚至在他们探索IRIS带来的许多强大功能之前。 我们诚挚地邀请您参加我们的网络研讨会,介绍新版本的亮点,时间是美国东部时间6月17日上午11点。网络研讨会将被记录下来,并在会后进行 重播。 Release Highlights 在InterSystems IRIS 2021.1,客户可以部署 InterSystems IRIS Adaptive Analytics,Adaptive Analytics是一个附加产品,它扩展了InterSystems IRIS,为商业用户提供了卓越的易用性和自助分析能力,使他们能够对大量数据进行可视化、分析和查询,以获得他们所需的信息,从而做出及时和准确的商业决策,而无需是数据设计或数据管理方面的专家。Adaptive Analytics通过在后台自主构建和维护临时数据结构,透明地加速了针对InterSystems IRIS运行的分析查询工作负载。 该版本中的其他新亮点功能包括。 改进了我们的外部语言服务器的可管理性,现在也包括R和Python。这种网关技术使您能够以您选择的语言稳健和可扩展地利用服务器端代码。 InterSystems Kubernetes Operator(IKO)为您的环境提供声明式配置和自动化,现在还支持部署InterSystems System Alerting & Monitoring(SAM)。 InterSystems API Manager v2.3,包括改进的用户体验、Kafka支持和混合模式。 IntegratedML的主流可用性,使SQL开发人员能够直接在一个纯粹的基于SQL的环境中构建和部署机器学习模型。 支持分片表上的流字段,使您在InterSystems IRIS水平可扩展架构上获得完全的SQL模式灵活性。 一个iris-lockeddown容器镜像,实现了许多安全最佳实践,如禁用管理门户的网络访问和适当的操作系统级权限。 支持用于Oauth 2.0的代码交换的证明密钥(PKCE)。 InterSystems IRIS for Health 2021.1包括InterSystems IRIS的所有改进功能。此外,该版本通过用于解析和评估FHIRPath表达式的API,进一步扩展了该平台对FHIR®标准的全面支持。这是对2020.1以来发布的重要的FHIR相关功能的补充,包括对FHIR Profiles、FHIR R4 Transforms和FHIR客户端API的支持。 该版本还包括HealthShare Health Connect,这是我们基于IRIS for Health的集成引擎,提供大批量的交易支持、流程管理和监控,以支持关键任务应用。有关其功能集与InterSystems IRIS for Health的比较的详细概述,请参见这里。 关于所有这些功能的更多细节可以在产品文档中找到,该文档最近通过方便的目录侧边栏变得更加容易浏览。 InterSystems IRIS 2021.1 文档和发布说明 InterSystems IRIS for Health 2021.1 文档和发布说明 HealthShare Health Connect 2021.1 文档和发布说明 如果您从早期版本升级并使用TLS 1.3,请参见这些升级注意事项。 如何获得软件 InterSystems IRIS 2021.1是一个扩展维护(EM)版本,并附带有适用于所有支持平台的经典安装包,以及OCI(Open Container Initiative)又称Docker格式的容器镜像。 每个产品的完整安装包都可以从WRC的产品下载网站获得。使用 "自定义 "安装选项使用户能够选择他们需要的选项,如InterSystems Studio和IntegratedML,以合理地缩小其安装规模。 InterSystems IRIS和IRIS for Health的企业版容器映像以及所有相应的组件可通过InterSystems容器注册中心使用以下命令获得: docker pull containers.intersystems.com/intersystems/iris:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/iris-ml:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/irishealth:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.1.0.215.0 有关可用图像的完整列表,请参考ICR文件。 社区版的容器图像也可以使用以下命令从Docker商店中提取。 docker pull store/intersystems/iris-community:2021.1.0.215.0 docker pull store/intersystems/iris-ml-community:2021.1.0.215.0 docker pull store/intersystems/irishealth-community:2021.1.0.215.0 docker pull store/intersystems/irishealth-ml-community:2021.1.0.215.0 另外,所有容器镜像的tarball版本可以通过WRC的产品下载网站获得。 InterSystems IRIS Studio 2021.1是一个独立的IDE,用于Microsoft Windows,可以通过WRC的产品下载网站下载。它适用于InterSystems IRIS和IRIS for Health 2021.1及以下版本。InterSystems还支持VSCode ObjectScript插件,用于用Visual Studio Code为InterSystems IRIS开发应用程序,该插件可用于Microsoft Windows、Linux和MacOS。 其他独立的InterSystems IRIS 2021.1组件,如ODBC驱动程序和Web网关,可从同一页面获得。 分享您的经验 我们每年只能宣布一个EM版本,所以我们很高兴看到这个版本现在达到了GA的里程碑,并渴望听到你对新软件的体验。请不要犹豫,通过您的客户团队或在开发人员社区上与您联系,对该技术或您使用该技术解决的使用案例提出任何意见。 对于选定的新功能和产品,我们已经建立了早期访问计划,允许我们的用户在软件发布之前进行评估。通过这些有针对性的举措,我们可以向目标受众学习,并确保新产品在发布时能够满足他们的需求。如果您有兴趣参与其中任何一项,请通过您的客户团队或观看开发人员社区进行联系。
公告
Nicky Zhu · 三月 30, 2021

Caché、Ensemble和InterSystems IRIS的维护版本发布

现已推出三套新的维护版本: Caché 2018.1.5, Ensemble 2018.1.5, and HSAP 2018.1.5 InterSystems IRIS 2019.1.2, IRIS for Health 2019.1.2, and HealthShare Health Connect 2019.1.2 InterSystems IRIS 2020.1.1, IRIS for Health 2020.1.1, and HealthShare Health Connect 2020.1.1 安装包和容器版本可从以下网站下载 WRC Software Distribution site。 这些都是维护版本,在广泛的领域内有许多更新。 有关这些版本中的修正信息,请参考该版本的文档,其中包括发行说明和升级检查表、发行变更列表,以及类参考资料和全套指南、参考资料、教程和文章。所有的文档都可以通过以下方式获得 docs.intersystems.com 。 在这些版本中也加入了新的平台支持。 特别是,Ubuntu 20.04 LTS的支持已经添加到所有版本中,IBM AIX 7.1和7.2对System p-64的支持已经添加到2019.1.2中(并且已经在2020.1中),而对Linux的ARM64支持已经添加到2020.1.1中。 详情请参见各版本的支持平台文档。 这些版本的构建号如下表所示: 版本 产品 构建号 2018.1.5 Caché and Ensemble 2018.1.5.659.0 2018.1.5 Caché Evaluation 2018.1.5.659.0su 2018.1.5 HealthShare Health Connect (HSAP) 2018.1.5HS.9056.0 2019.1.2 InterSystems IRIS 2019.1.2.718.0 2019.1.2 IRIS for Health 2019.1.2.718.0 2019.1.2 HealthShare Health Connect 2019.1.2.718.0 2020.1.1 InterSystems IRIS 2020.1.1.408.0 2020.1.1 IRIS for Health 2020.1.1.408.0 2020.1.1 HealthShare Health Connect 2020.1.1.408.0 2020.1.1 InterSystems IRIS Community 2020.1.1.408.0 2020.1.1 IRIS for Health Community 2020.1.1.408.0 2020.1.1 IRIS Studio 2020.1.1.408.0
文章
Jingwei Wang · 十二月 22, 2021

使用内置REST API监控InterSystems IRIS

IRIS 2019.4 预览版中发布了/api/monitor服务,以Prometheus格式展示IRIS指标,但没有正式公布。对于任何想要使用IRIS指标作为其监控和警报解决方案的一部分的人来说,这是一个大新闻。该API是新的IRIS 系统警报和监控(SAM)解决方案的一个组成部分,将在IRIS的一个即将到来的版本中发布。 然而,你不必等待SAM开始规划和试用这个API来监控你的IRIS实例。在未来的文章中,我将深入挖掘可用的指标和它们的含义,并提供交互式仪表盘的例子。但首先,让我从一些背景和一些问题和答案开始。 IRIS(和Caché)总是在收集关于它自己和它所运行的平台的几十个指标。一直以来都有多种收集这些指标的方法来监控Caché和IRIS。我发现,很少有安装使用IRIS和Caché内置的解决方案。例如,History Monitor仪表盘作为性能和系统使用指标的历史数据库已经存在很长时间了。然而,没有明显的方法来展现这些指标,并实时监测系统。 IRIS平台的解决方案正在从运行在几个企业内部的实例上的单体应用程序,转向分布式解决方案部署在 "任何地方"。对于许多用例,现有的IRIS监控选项并不适合这些新的模式。InterSystems没有使用陈旧的方法,而是寻找当前流行的、经过验证的开源解决方案进行监控和警报。 普罗米修斯? 普罗米修斯是一个著名的、广泛部署的、技术成熟的开源监控系统。它有各种各样的插件,且能在云环境中很好地工作,对本地部署也同样有用。其插件包括操作系统、网络服务器(如Apache)和许多其他应用程序。普罗米修斯通常与可视化工具一起使用,例如,Grafana。 Grafana? Grafana也是开源的。随着这一系列文章的进行,我将提供常见场景的监控仪表盘的样本模板。你可以把这些样本作为基础,为你所关心的事情设计仪表盘。当你把IRIS的指标与你整个解决方案堆栈的指标结合起来时,真正的力量就来了。从平台组件、操作系统、IRIS,特别是当你从你的应用程序中添加仪器时。 以前没有使用过吗? 用Prometheus和Grafana监控IRIS和Caché并不新鲜。几年来,我一直在使用这些应用程序来监控我的开发和测试系统。如果你在开发者社区搜索 "Prometheus",你会发现其他的帖子(例如,Mikhail Khomenko的一些优秀帖子),显示如何暴露Caché指标供Prometheus使用。 现在版本的区别是,/api/monitor API被包括在版本内,并且默认启用。不需要编码你自己的类来暴露度量。 普罗米修斯入门 这里是对Prometheus和一些术语的快速介绍。我希望你能看到高层次的东西,帮你考虑如何可视化或使用metrics打下一些基础。 普罗米修斯的工作方式是刮取或拉取从HTTP端点(API,如IRIS /api/monitor)的应用程序中暴露的时序数据。Exporters和客户端库存在于许多语言、框架和开源应用程序,例如,网络服务器Apache、操作系统、docker、Kubernetes、数据库以及现在的IRIS。 Exporters被用来检测应用程序和服务,并在一个端点上展示相关的指标,以便进行数据拉取。核心exporters支持网络服务器、数据库等标准组件。许多其他开源exporters可从Prometheus社区获得。 普罗米修斯术语 有几个关键术语是需要了解。 Targets是服务所在的目标,如主机或应用程序或Apache或IRIS等服务或你自己的应用程序。 普罗米修斯通过HTTP对目标进行抓取,收集时间序列数据的指标。 时间序列数据是由应用程序暴露的,例如IRIS或通过exporters。 Exporters可用于你无法控制的东西,如Linux内核指标。 由此产生的时间序列数据被储存在Prometheus服务器的本地数据库中。 时间序列数据库可以使用优化的查询语言(PromQL)进行查询。例如,创建警报或由客户应用程序(如Grafana)在仪表板上显示指标。 然而,对Prometheus数据库的访问--在IRIS上--是透明的,Grafana等应用程序不知道也不关心。 Spoiler Alert:出于安全、扩展、高可用性和其他一些运行效率的考虑,对于新的SAM解决方案,用于Prometheus时间序列数据的数据库是IRIS!这也是为什么我们要把Prometheus数据库的访问权放在IRIS上。然而,对Prometheus数据库的访问在IRIS上是透明的,Grafana等应用程序不知道也不关心。 普罗米修斯数据模型 由API返回的metrics是Prometheus格式的。普罗米修斯使用一种简单的基于文本的指标格式,每行有一个指标,格式是。 <identifier> [ (time n, value n), ....] 衡量标准使用标签(键,值)对。标签是一种强大的作为维度的方式来过滤度量。例如,检测IRIS /api/monitor返回的单一指标:日志的可用空间。 iris_jrn_free_space{id="WIJ",dir=”/fast/wij/"} 401562.83 标识符告诉你该指标是什么。 iris_jrn_free_space 多个标签可以用来修饰指标,用来过滤和查询。在这个例子中,可以看到 WIJ 和存储 WIJ 的目录。 id="WIJ",dir="/fast/wij/" 和值: 401562.83 (MB). What IRIS metrics are available? The preview documentation has a list of metrics. However, be aware there may be changes. You can also simply query the /api/monitor/metrics endpoint and see the list. I use Postman which I will demonstrate in the next community post. 可以用哪些IRIS指标? 预览文档有一个metrics的列表。请注意可能会有变化。你也可以简单地查询/api/monitor/metrics端点并查看该列表。我将在下一篇社区文章中演示使用Postman调用这个端点。 应该监控什么? 当你考虑如何监控你的系统和应用程序时,请牢记这些要点。 对影响用户的关键指标进行检测。 用户并不关心你的一台机器的CPU是否不足。 用户关心的是服务是否缓慢或有错误。 对于你的主要仪表盘来说,重点是直接影响用户的高级指标。 对于你的仪表盘来说,要避免一整面墙的图表。 人类无法同时处理太多的数据。 例如,每个服务拥有一个仪表板。 考虑服务,而不是机器。 一旦你把问题隔离到一个服务上,那么你就可以深入研究,看看是否是一台机器的问题。 参考资料 文档下载:Prometheus 和 Grafana 我在InterSystems 2019年全球峰会上介绍了SAM(包括Prometheus和Grafana)的预发布概述,你可以找到InterSystems学习服务网站的链接。如果链接不起作用,请进入InterSystems学习服务网站并搜索。"系统警报和监控变得简单" 在社区中搜索 "Prometheus "和 "Grafana"。查看原帖 由 @Murray Oldfield 撰写
公告
Tingting Jiang · 六月 21, 2022

InterSystems热招职位(3):Technical Specialist(Product Support)

InterSystems正在招聘Technical Specialist(Product Support),欢迎您的自荐、推荐。 请将简历投递至Belinda.Glasson@intersystems.com,愿您的加入给我们带来新的活力,我们也将为您提供广阔的发展空间!(由于岗位职能要求,职位说明以英文形式发布。) Location:Beijing Job Title:Technical Specialist Department:Product Support Reporting to:China Support Supervisor What We Do Matters Why are we here? To ensure that our customers have reliable access to the right information at the right time—information they can share and use to draw insights, leading to better decisions. Job Summary The Technical Specialist will be required to perform custom development tasks and provide support for InterSystems TrakCare and related products. The Technical Specialist will be responsible for site specific software support and development activities and to ensure that the software satisfies project specifications and is delivered and deployed in line with project requirements. The Technical Specialist must be available to visit client sites (e.g. hospitals/laboratories) and implementation partners for technical support and/or to provide technical training. Some travel may be required. Key Responsibilities of the Role Provide immediate response to customer inquiries in accordance with service standards. Provide technical support for interfaces, reports, extracts, data migration scripts and conversions. Provide advice and best practices for technical areas such as networks, configurations, architectures etc. Provide technical support for troubleshooting and performance analysis for reports, stored procedures, interfaces, conversions, data migration scripts and user defined functions. Escalate Open (unresolved) problems in accordance with current policies and procedures. Production of training materials for technical courses such as system custom development or reporting. Production of technical documentation such as reference materials, installation instructions, user guides, knowledge-base articles. Continuously improve customer satisfaction by soliciting customer suggestions for product and service improvements and then escalating such suggestions to management. Improve response time to customer inquiries by continuously improving communication, analytical, and learning skills. Participate in on-site technical training if required. Participate in on-site technical implementations if required. Participate in the on call 24 hour roster service. Assistance in researching new development or report writing 3rd party products such as JReports. Experience and Qualifications BS or MS in Computer Science or equivalent. Knowledge of web oriented languages, including HTML, and Java script, SQL, data analysis and database methodologies. Knowledge of Linux is strongly desired, VMWare is a plus. Knowledge of programming languages – ideally Java or C++. Personal Specifications Information Technology or Science Degree
文章
Michael Lei · 八月 9, 2022

社区文章汇总--跟着社区学习InterSystems 技术

在这篇文章中,你可以访问InterSystems开发者社区中与学习InterSystems IRIS最相关主题的文章库。找到按机器学习、嵌入式Python、JSON、API和REST应用、管理和配置InterSystems环境、Docker和云、VSCode、SQL、分析/BI、全局、安全、DevOps、互操作性、Native API排列的顶级发表的文章。快来享受学习的乐趣吧! 机器学习 机器学习是建立先进的数据分析和自动化人工活动的一种必要的技术,具有很好的效率。它可以创建认知模型,从现有的数据中学习,并根据其自我调整的算法进行预测、概率计算、分类、识别和 "非创造性 "的人类活动的自动化。 在所有情况下,InterSystems IRIS作为一个数据平台和环境来创建、执行、提供和使用这些机器学习模型。IRIS能够从SQL命令(IntegratedML)中使用ML,使用嵌入式Python和PMML(预测模型标记语言)来执行ML。你可以在以下文章中查看它的功能: 标题 描述 地址URL 一体化机器学习动手实验 一体化机器学习概览ML https://cn.community.intersystems.com/node/517656 AI Robotization with InterSystems IRIS Data Platform(英文) AI on IRIS productions https://community.intersystems.com/post/ai-robotization-intersystems-iris-data-platform 利用IRIS 一体化机器学习IntegratedML来预测糖尿病的Web 应用 一体化机器学习示例 https://cn.community.intersystems.com/node/519381 Predict Maternal Health Risks(英文) 一体化机器学习示例 https://community.intersystems.com/post/predict-maternal-health-risks Using Machine Learning to Organize the Community – 1(英文) Using Python ML libraries https://community.intersystems.com/post/using-machine-learning-organize-community-1 ObjectScript 语言 ObjectScript是InterSystems的官方编程语言。它简单、灵活,在创建后台、集成和分析应用程序方面非常强大。请查阅以下文章以了解更多信息: 标题 描述 地址URL InterSystems ObjectScript 101++ (英文) Video series to learn ObjectScript https://community.intersystems.com/post/intersystems-objectscript-101-en On $Sequence function(英文) Create sequences of numbers https://community.intersystems.com/post/sequence-function Writing better-performing loops in Caché ObjectScript(英文) Do loops https://community.intersystems.com/post/writing-better-performing-loops-cach%C3%A9-objectscript 数据匿名化 IRIS-Disguise 工具介绍 学习如何定制化 ObjectScript 持久化类和属性 https://cn.community.intersystems.com/node/509271 ObjectScript 错误处理片段 异常处理 https://cn.community.intersystems.com/node/523756 Traditional Debugging in ObjectScript(英文) Debug技巧 https://community.intersystems.com/post/traditional-debugging-objectscript 在Caché中使用正则表达式 使用正则表达式 https://cn.community.intersystems.com/node/487941 Robust Error Handling and Cleanup in ObjectScript(英文) 高质量代码 https://community.intersystems.com/post/robust-error-handling-and-cleanup-objectscript SPOOL - the forgotten device(英文) 使用 Spool https://community.intersystems.com/post/spool-forgotten-device How we learned to stop worrying and love InterSystems Ensemble(英文) Processing JSON on Productions https://community.intersystems.com/post/how-we-learned-stop-worrying-and-love-intersystems-ensemble 一个更有用的 Object Dump 对象Dumping https://cn.community.intersystems.com/node/523761 Logging using macros in InterSystems IRIS(英文) Logging using macros https://community.intersystems.com/post/logging-using-macros-intersystems-iris SYSLOG - what it really is and what it means(英文) Debug information on Syslog https://community.intersystems.com/post/syslog-what-it-really-and-what-it-means Tips for debugging with %Status(英文) Debug using %Status https://community.intersystems.com/post/tips-debugging-status 发挥 $Query 的最大作用 使用 $Query 查找数据 https://cn.community.intersystems.com/node/519806 Multidimensional Property Persistence - Part 1 (Classic) (英文) Multidimensional persistent properties https://community.intersystems.com/post/multidimensional-property-persistence-part-1-classic The adopted Bitmap(英文) Bitmap indexes https://community.intersystems.com/post/adopted-bitmap 如何成为时间领主 - 诞生 日期和时间API https://cn.community.intersystems.com/node/513356 Importance and Collection of Exact Version Information ($zv / $zversion)(英文) Get IRIS version https://community.intersystems.com/post/importance-and-collection-exact-version-information-zv-zversion Date before Dec.1840 ? Negative $H(orolog) ?(英文) 日期为负 https://community.intersystems.com/post/date-dec1840-negative-horolog Creating a Custom Index Type in Caché (英文) 创建定制索引 https://community.intersystems.com/post/creating-custom-index-type-cach%C3%A9 $LIST string format and %DynamicArray and %DynamicObject classes(英文) Using $LIST, Dynamic Object, and Dynamic Arrays https://community.intersystems.com/post/list-string-format-and-dynamicarray-and-dynamicobject-classes SQL for ^ERROR Global(英文) Use SQL to see Error content https://community.intersystems.com/post/sql-error-global Add a default setting value by code (英文) 设置默认值 https://community.intersystems.com/post/add-default-setting-value-code Iterate over dynamic object(英文) Use Iterate https://community.intersystems.com/post/iterate-over-dynamic-object 列出类的所有属性 (我喜欢 ObjectScript 的原因) ObjectScript 属性详解 https://cn.community.intersystems.com/node/512981 Try catch block I usually use in InterSystems ObjectScript(英文) Try Catch 处理 https://community.intersystems.com/post/try-catch-block-i-usually-use-intersystems-objectscript 在ObjectScript中运行shell命令 Run shell commands https://cn.community.intersystems.com/node/523766 嵌入式 Python Python是世界上最流行和最常用的编程语言之一(https://www.tiobe.com/tiobe-index/)。InterSystems IRIS是一个对所有主要编程语言开放的数据平台。然而,说到Python,这种神奇的语言和它的库在IRIS中到处都可以使用:在类、SQL和集成/制作中。对于那些不知道或不想知道ObjectScript(InterSystems编程语言)的人来说,这是一个不错的选择。请看下面的文章,了解如何做到这一点: 标题 描述 URL地址 Let's fight against the machines(英文) Build a tic tac toe game using Embedded Python https://community.intersystems.com/post/lets-fight-against-machines InterSystems IRIS 2021.2+ Python 代码样例 (Embedded嵌入式Python, Native 原生APIs 和 Notebooks) 使用 Python notebook 和 IRIS https://cn.community.intersystems.com/node/508691 WebSocket Client with embedded Python(英文) Custom Socket sample https://community.intersystems.com/post/websocket-client-embedded-python IRIS Python Native API in AWS Lambda (英文) Python on AWS https://community.intersystems.com/post/iris-python-native-api-aws-lambda How I added ObjectScript to Jupyter Notebooks(英文) IRIS on notebooks https://community.intersystems.com/post/how-i-added-objectscript-jupyter-notebooks Welcome Django(英文) Create Python Django apps with IRIS as a database https://community.intersystems.com/post/welcome-django Geocoding with IRIS and Google Maps API (英文) Using Geocoding python library https://community.intersystems.com/post/geocoding-iris-and-google-maps-api 使用IRIS 和Python gTTS 实现文本转化声音的REST服务 使用 gTTS 的Python 案例 https://cn.community.intersystems.com/node/517551 使用 Python Flask Web 框架构建 IRIS 响应式仪表板 基于IRIS 的Flask web 应用 https://cn.community.intersystems.com/node/513086 JSON JSON 是市场上最广泛使用的发送和接收数据的互操作性格式之一。InterSystems IRIS以多种方式支持这种格式。可以让你的本地数据库使用JSON(DocDB),序列化和反序列化对象,用JSON处理请求和响应,特别是来自REST服务的请求和响应。回顾以下文章: 标题 描述 URL地址 Introducing new JSON capabilities in Caché 2016.1 (英文) Presenting ObjectScript JSON API https://community.intersystems.com/post/introducing-new-json-capabilities-cach%C3%A9-20161 JSON Enhancements(英文) JSON Adaptor API https://community.intersystems.com/post/json-enhancements API 和 REST 应用Applications 后台应用程序目前是以REST(Representational State Transfer)范式开发的,并以Web API的形式暴露。下面的文章将帮助你了解它是如何工作的: 标题 描述 URL地址 GraphQL for InterSystems Data Platforms (英文) Create REST API with GraphQL style https://community.intersystems.com/post/graphql-intersystems-data-platforms Introducing InterSystems API Manager (英文) API Management overview https://community.intersystems.com/post/introducing-intersystems-api-manager Advanced URL mapping for REST Mapping routes to your APIs https://community.intersystems.com/post/advanced-url-mapping-rest AppS.REST - a new REST framework for InterSystems IRIS Create REST apps easily https://community.intersystems.com/post/appsrest-new-rest-framework-intersystems-iris RESTForms - REST API for your classes Create REST API for CRUD applications https://community.intersystems.com/post/restforms-rest-api-your-classes 使用规范优先的方式开发REST API 以合同优先的方式开发API https://cn.community.intersystems.com/node/484341 ObjectScript REST API Cookbook(英文) REST API development tips https://community.intersystems.com/post/objectscript-rest-api-cookbook 从持久类和序列类生成 Swagger 规范 Contract First Approach to develop APIs https://cn.community.intersystems.com/node/484311 InterSystems IRIS REST Application Patterns Create API REST using IRIS https://community.intersystems.com/post/intersystems-iris-rest-application-patterns Let's create an FHIR profile using SUSHI Part 1(英文) Create custom FHIR profiles https://community.intersystems.com/post/lets-create-fhir-profile-using-sushi-part-1 IAM (InterSystems API Manager), Zero to Hero(英文) Manage your APIs with IAM https://community.intersystems.com/post/iam-intersystems-api-manager-zero-hero Using InterSystems API Management to Load Balance an API (英文) Use APIM to do API load balance https://community.intersystems.com/post/using-intersystems-api-management-load-balance-api IAM实践指南——OAuth 2.0下的API保卫战(第一部分) Secure your API using APIM https://cn.community.intersystems.com/node/487141 Getting an Angular UI for your InterSystems IRIS application in 5 minutes (英文) Full Stack app with IRIS and Angular https://community.intersystems.com/post/getting-angular-ui-your-intersystems-iris-application-5-minutes Upload into an InterSystems IRIS REST API (英文) Save files using REST API https://community.intersystems.com/post/upload-intersystems-iris-rest-api 管理和配置InterSystems环境 IRIS环境的良好管理和配置对用户使用的应用程序的性能、安全性、可用性和可靠性至关重要。这些文章可以给你很好的提示,告诉你如何做到这一点: 标题 描述 URL地址 InterSystems 数据平台的容量规划和性能系列文章 容量和性能规划提升 https://cn.community.intersystems.com/node/483921 Deploying Applications in InterSystems Cache with %Installer(英文) Using %Installer to create namespaces, databases, and applications configuration https://community.intersystems.com/post/deploying-applications-intersystems-cache-installer Horizontal Scalability with InterSystems IRIS(英文) Set IRIS instances for horizontal scalability https://community.intersystems.com/post/horizontal-scalability-intersystems-iris The InterSystems Iris Fhirserver running on a Raspberry Pi Raspberry running as a FHIRserver(英文) Run IRIS inside Raspberry PI https://community.intersystems.com/post/intersystems-iris-fhirserver-running-raspberry-pi-raspberry-running-fhirserver Database Mirroring without a Virtual IP Address(英文) Set mirrors using VIP https://community.intersystems.com/post/database-mirroring-without-virtual-ip-address Apache Web Gateway with Docker(英文) Configure SSL and Web Gateway for web applications https://community.intersystems.com/post/apache-web-gateway-docker Work with SAML in IRIS(英文) SAML to Web services https://community.intersystems.com/post/work-saml-iris 掌握 %SYSTEM.Encryption 加密类 Encrypt and decrypt using IRIS https://cn.community.intersystems.com/node/518191 Docker 和 Cloud 新的应用架构在容器Docker和云中工作,旨在实现弹性扩展,快速安装、配置和提供服务,并降低基础设施的复杂性和成本。学习这些文章,了解如何将IRIS带入云中: 题目 描述 URL地址 Highly available IRIS deployment on Kubernetes without mirroring(英文) IRIS on cloud clusters with Kubernetes https://community.intersystems.com/post/highly-available-iris-deployment-kubernetes-without-mirroring 面向 Amazon Web Services (AWS) 的 InterSystems IRIS 示例参考架构 基于AWS的IRIS https://cn.community.intersystems.com/node/484351 面向 Microsoft Azure Resource Manager (ARM) 的 InterSystems 示例参考架构 基于Azure 资源管理器(ARM)架构的IRIS https://cn.community.intersystems.com/node/484361 Dockerfile 和它的朋友们或者如何在 InterSystems IRIS 上运行和合作 ObjectScript 项目 Docker项目里的重要文件管理 https://cn.community.intersystems.com/node/484326 InterSystems IRIS Deployment Guide for AWS using CloudFormation template(英文) IRIS on AWS using CloudFormation https://community.intersystems.com/post/intersystems-iris-deployment%C2%A0guide-aws%C2%A0using-cloudformation-template 面向 Google Cloud Platform (GCP) 的 InterSystems IRIS 示例参考架构 IRIS on Google Cloud https://cn.community.intersystems.com/node/484056 Using AWS Glue with InterSystems IRIS(英文) Using IRIS and AWS Glue (AWS ETL tool) https://community.intersystems.com/post/using-aws-glue-intersystems-iris Amazon EKS, IRIS 高可用与备份 基于AWS的IRIS高可用 https://cn.community.intersystems.com/node/517536 Running InterSystems Reports in containers(英文) IRIS reports on Docker https://community.intersystems.com/post/running-intersystems-reports-containers Running InterSystems IRIS in a FaaS mode with Kubeless(英文) IRIS on Kubernetes https://community.intersystems.com/post/running-intersystems-iris-faas-mode-kubeless InterSystems Kubernetes Operator Deep Dive: Introduction to Kubernetes Operators(英文) IRIS on Kubernetes https://community.intersystems.com/post/intersystems-kubernetes-operator-deep-dive-introduction-kubernetes-operators Scaling Cloud Hosts and Reconfiguring InterSystems IRIS(英文) Scaling IRIS on AWS, Azure, or GCP https://community.intersystems.com/post/scaling-cloud-hosts-and-reconfiguring-intersystems-iris Deploying a Simple IRIS-Based Web Application Using Amazon EKS(英文) IRIS on AWS https://community.intersystems.com/post/deploying-simple-iris-based-web-application-using-amazon-eks VSCode VSCode是世界上最常用的开发IDE之一。IRIS完全支持这个IDE。请看以下文章: 标题 描述 URL地址 GitHub上的VSCode-ObjectScript 在网页版 Github VSCode上开发IRIS 应用 https://community.intersystems.com/post/vscode-objectscript-github GitHub Codespaces with IRIS(英文) Develop IRIS apps into Web Github https://community.intersystems.com/post/github-codespaces-iris VSCode Tips & Tricks - SOAP Wizard(英文) Create shortcut option on VSCode https://community.intersystems.com/post/vscode-tips-tricks-soap-wizard Adding your own snippets to VS Code(英文) Create snippets https://community.intersystems.com/post/adding-your-own-snippets-vs-code SQL SQL是处理关系型数据库的最常用语言之一。这些文章展示了如何进行查询和数据持久性: 标题 描述 URL地址 Free Text Search: The Way To Search Your Text Fields That SQL Developers Are Hiding From You!*(英文) Using Indexes to promote advanced search https://community.intersystems.com/post/free-text-search-way-search-your-text-fields-sql-developers-are-hiding-you 改善日期范围查询的SQL性能 使用日期进行SQL查询 https://cn.community.intersystems.com/node/523636 Static WHERE Conditions(英文) Where on Persistent Classes https://community.intersystems.com/post/static-where-conditions 2021.2 SQL Feature Spotlight - Run Time Plan Choice(英文) Select Runtime SQL Execution Plan https://community.intersystems.com/post/20212-sql-feature-spotlight-run-time-plan-choice New in 2020.1: the Universal Query Cache(英文) SQL Cache https://community.intersystems.com/post/new-20201-universal-query-cache Materialized Views(英文) Create views inside persistent classes https://community.intersystems.com/post/materialized-views SQL Debug 小技巧 Debug SQL commands https://cn.community.intersystems.com/node/518701 Using ClassQueries() as Tables(英文) Creating views https://community.intersystems.com/post/using-classqueries-tables M:N Relationship(英文) Mapping N to N relationships https://community.intersystems.com/post/mn-relationship Reading AWS S3 data on COVID as SQL table in IRIS (英文) Get CSV data from AWS S3 to IRIS table https://community.intersystems.com/post/reading-aws-s3-data-covid-sql-table-iris The One Query Performance Trick You NEED to Know? Tune Table! (英文) SQL tunning https://community.intersystems.com/post/one-query-performance-trick-you-need-know-tune-table Data Storage - Information You Must Know to Make Good Decisions When Developing (英文) Configure the data storage section on a persistent class to get more performance https://community.intersystems.com/post/data-storage-information-you-must-know-make-good-decisions-when-developing Improve SQL Performance for Date Queries, AGAIN! (英文) Tunning SQL queries for dates https://community.intersystems.com/post/improve-sql-performance-date-queries-again Scrollable ResultSet Pagination Sample(英文) Paginate SQL results (see comments too) https://community.intersystems.com/post/scrollable-resultset-pagination-sample 第 1 天:使用 InterSystems Object 和 SQL 进行开发 Concepts about SQL into InterSystems IRIS https://cn.community.intersystems.com/node/490806 DB Migration using SQLgateway(英文) Migrate from PostgreSQL, MySQL, and other databases to IRIS https://community.intersystems.com/post/db-migration-using-sqlgateway Importing CSV into the Existing Table in InterSystems IRIS(英文) Import CSV to SQL Table https://community.intersystems.com/post/importing-csv-existing-table-intersystems-iris 访问IRIS数据平台的四种API方式 SQL API https://cn.community.intersystems.com/node/493276 Indexing of non-atomic attributes(英文) Create advanced index options https://community.intersystems.com/post/indexing-non-atomic-attributes Know Your Indices(英文) Index creation fundamentals https://community.intersystems.com/post/know-your-indices Dynamic SQL to Dynamic Object(英文) Use DynamicSQL https://community.intersystems.com/post/dynamic-sql-dynamic-object 数据迁移工具 - 第一部分: 从 Postgres 到 IRIS 如何从其他数据库迁移到 IRIS 的系列文章 https://cn.community.intersystems.com/node/510831 BI与分析 BI和分析可以根据图形、仪表盘、摘要和详细表格中的数据分析,并根据分析员用户的导航和数据探索来做出决策。以下是如何使用IRIS建立分析应用的方法: 标题 描述 URL地址 InterSystems IRIS 上的 COVID-19 分析 分析全球疫情的仪表盘 https://community.intersystems.com/post/covid-19-analytics-intersystems-iris DeepSee Troubleshooting Guide(英文) Fix problems https://community.intersystems.com/post/deepsee-troubleshooting-guide AnalyzeThis – Quick start into InterSystems BI (英文) Quick start into IRIS BI https://community.intersystems.com/post/analyzethis-%E2%80%93-quick-start-intersystems-bi Power BI Connector for InterSystems IRIS. Part I(英文) Using IRIS data inside Power BI https://community.intersystems.com/post/power-bi-connector-intersystems-iris-part-i Creating Portlets in DeepSee(英文) Analytics Portlets with IRIS BI https://community.intersystems.com/post/creating-portlets-deepsee Game Of Throne Analytics or How long is Arya's Stark List(英文) Analytics sample https://community.intersystems.com/post/game-throne-analytics-or-how-long-aryas-stark-list DeepSee Web: InterSystems Analytics Visualization with AngularJS. Part 1(英文) Web dashboards using Angular https://community.intersystems.com/post/deepsee-web-intersystems-analytics-visualization-angularjs-part-1 Building Analytics Solution with IRIS(英文) Present main options to do analytics with IRIS https://community.intersystems.com/post/building-analytics-solution-iris Globals Globals 是IRIS中灵活存储和检索数据的关键机制,无论是SQL、类、JSON文档、BI立方体,还是其他自定义格式。在下面的文章中可以看到如何做到这一点: 题目 描述 URL地址 The Art of Mapping Globals to Classes 1 of 3(英文) Mapping globals to SQL tables and Objects https://community.intersystems.com/post/art-mapping-globals-classes-1-3 Globals 是管理数据的魔剑 : 第一部分 Globals 基础 https://cn.community.intersystems.com/node/520821 GlobalToJSON-embeddedPython-pure(英文) Export globals to JSON https://community.intersystems.com/post/globaltojson-embeddedpython-pure Transactions in Global InterSystems IRIS(英文) Manage transactions on Globals persistence https://community.intersystems.com/post/transactions-global-intersystems-iris Store Mindmaps using Globals(英文) Using globals to persist mindmap data https://community.intersystems.com/post/store-mindmaps-using-globals 安全 确保任何应用程序的安全是至关重要的。安全性与访问和授权管理有关,跟踪和审计交易,对存储和传输的内容进行加密,以及设置正确的配置参数以确保合理资源的保护。阅读这些文章,了解更多关于如何建立安全的信息: 标题 Description URL InterSystems IRIS 开放授权框架 (OAuth 2.0) 实现 – 第 1 部分 使用 OAuth https://cn.community.intersystems.com/node/484366 Debugging Web(英文) Debugging CSP and REST apps https://community.intersystems.com/post/debugging-web Class Queries in InterSystems IRIS(英文) Defining SQL Queries inside Persistent classes https://community.intersystems.com/post/class-queries-intersystems-iris 在TLS/SSL中使用操作系统的证书库 利用 OS 证书实现 SSL https://cn.community.intersystems.com/node/518186 一致性检查_ 加速还是减速 保证一致性 https://cn.community.intersystems.com/node/485041 跟踪数据更改 - 审计日志 - 上篇 保存审计数据 https://cn.community.intersystems.com/node/486831 Running the Management Portal (Private Web Server) Over TLS/SSL/HTTPS(英文) Configure SSL to IRIS Web Server https://community.intersystems.com/post/running-management-portal-private-web-server-over-tlssslhttps OAuth Authorization and InterSystems IRIS: Taming Trust Protocols(英文) Using OAuth https://community.intersystems.com/post/oauth-authorization-and-intersystems-iris-taming-trust-protocols Using Oauth2 with SOAP (Web)Services(英文) Oauth setting for SOAP services https://community.intersystems.com/post/using-oauth2-soap-webservices DeepSee: Setting up security - Part 1 of 5(英文) Security on IRIS BI https://community.intersystems.com/post/deepsee-setting-security-part-1-5 Changes to the security level of the system(英文) Security by default https://community.intersystems.com/post/changes-security-level-system DevOps DevOps是一种采用实践和工具的方式,使源代码从开发(Dev)到生产运行(Ops)的快速和高质量的过渡成为可能。请看如何在IRIS中做到这一点。 题目 描述 URL地址 Continuous Delivery of your InterSystems solution using GitLab - Part I: Git(英文) Continuous delivery with GitLab https://community.intersystems.com/post/continuous-delivery-your-intersystems-solution-using-gitlab-part-i-git Introducing InterSystems ObjectScript Package Manager(英文) Use ZPM to configure and install third-party packages inside your application https://community.intersystems.com/post/introducing-intersystems-objectscript-package-manager ZPMshow - a helper for tired fingers(英文) How to use ZPM – IRIS Package Manager https://community.intersystems.com/post/zpmshow-helper-tired-fingers 如何以自动化方式/编程方式创建一个镜像环境 自动化创建镜像 https://cn.community.intersystems.com/node/512986 ObjectScript包管理器中的单元测试和测试覆盖率 为ObjectScript 代码质量创建单元测试 https://cn.community.intersystems.com/node/486826 使用Doker和配置文件模版来部署Sharded 集群 使用 CPF文件自动化配置 https://cn.community.intersystems.com/node/518356 Caché ObjectScript 快速参考 ObjectScript reference pdf document https://cn.community.intersystems.com/node/523791 The Anatomy of ZPM Module: Packaging Your InterSystems Solution(英文) Use ZPM to automate deployment https://community.intersystems.com/post/anatomy-zpm-module-packaging-your-intersystems-solution 在IRIS容器里添加VSCode 在容器中嵌入 VSCode https://cn.community.intersystems.com/node/516431 如何以编程/自动化方式为InterSystems IRIS创建新的数据库、命名空间和Web应用程序 自动化创建数据库和命名空间 https://cn.community.intersystems.com/node/523796 Unit Tests: Quality of your ObjectScript Code(英文) Quality Assurance with Unit Tests https://community.intersystems.com/post/unit-tests-quality-your-objectscript-code 一些有用的 InterSystems 开发者社区 Docker Images镜像 Docker社区镜像 https://cn.community.intersystems.com/node/515076 互操作性 IRIS有一个强大的数据和应用互操作性总线。通过以下文章了解如何使用它. 题目 描述 URL Sending Alerts from Ensemble via Telegram(英文) Production to send data to telegram https://community.intersystems.com/post/sending-alerts-ensemble-telegram [首次使用InterSystems IRIS]-让我们来使用互操作性! 创建BS, BO, BP和productions https://cn.community.intersystems.com/node/513971 使用嵌入式Python实现InterSystems IRIS 互操作性 使用Python创建BS, BO, BP和production https://cn.community.intersystems.com/node/512176 Ensemble / Interoperability Training Course(英文) Great sample to learn how to create productions https://community.intersystems.com/post/ensemble-interoperability-training-course 几个程序化实现互操作性的示例 使用 Python 或 ObjectScript 程序化Productions https://cn.community.intersystems.com/node/516221 Listing files in folder(英文) List files in a folder https://community.intersystems.com/post/listing-files-folder Containerising .Net/Java Gateways (or Kafka Integration Demo)(英文) Kafka support using Java or .Net Native API https://community.intersystems.com/post/containerising-netjava-gateways-or-kafka-integration-demo Implementing IRIS Integrations with .NET or Java using PEX(英文) Using PEX to create productions using Java or .Net https://community.intersystems.com/post/implementing-iris-integrations-net-or-java-using-pex Migrate from Java Business Host to PEX(英文) Using PEX https://community.intersystems.com/post/migrate-java-business-host-pex Using Tesseract OCR and Java Gateway(英文) Using Java PEX https://community.intersystems.com/post/using-tesseract-ocr-and-java-gateway Creating a PEX Business Operation(英文) Create Java PEX Business Operation https://community.intersystems.com/post/creating-pex-business-operation 在IRIS中联合运用OCR与NLP技术 Java PEX 样例 https://cn.community.intersystems.com/node/494206 Creating a custom interoperability business service using an HTTP Adapter(英文) Creating Business Services https://community.intersystems.com/post/creating-custom-interoperability-business-service-using-http-adapter 原生 API IRIS对市场上最常用的一些编程语言(Java、Javascript/NodeJS、.Net、C++和Python)的工作持开放态度。为了做到这一点,我们为这些语言中的每一种使用了本地API。请看这些文章: 题目 描述 URL地址 WebSocket Client JS with IRIS Native API as Docker Micro Server(英文) Using IRIS and NodeJS to do a WebSocket https://community.intersystems.com/post/websocket-client-js-iris-native-api-docker-micro-server IRIS Native API for ObjectScript(英文) Using Native APIs https://community.intersystems.com/post/iris-native-api-objectscript Using ZPM for Node.js(英文) Using ZPM on Node.js projects https://community.intersystems.com/post/using-zpm-nodejs Creating a PDF from a Text file(英文) Java Native API for generating PDF https://community.intersystems.com/post/creating-pdf-text-file How to Start Development with InterSystems IRIS in Less Than a Minute(英文) Start to develop using IRIS https://community.intersystems.com/post/how-start-development-intersystems-iris-less-minute Making a blog using Python + IRIS Globals(英文) A blog on using Python native API https://community.intersystems.com/post/making-blog-using-python-iris-globals 希望我们翻译哪片文章,欢迎给我们留言!
文章
Jingwei Wang · 九月 16, 2022

Java 连接到InterSystems IRIS数据库 - 使用 JDBC

连接前准备: Java 开发环境 InterSystems JDBC 驱动 Connection String 步骤: 配置 Classpath :指向InterSystems JDBC 驱动 - intersystems-jdbc-3.0.0.0.jar Connection String,其中import com.intersystems.jdbc*;用来导入驱动,User是命名空间名称。 import com.intersystems.jdbc*; import java.sql.Connection; public class JDBCConnection{ public static void main (String[] args) throws Exception { String dbUrl = "jdbc:IRIS://127.0.0.1:1972/User"; //replace String user = "SQLAdmin"; String pass = "deployment-password"; IRISDataSource ds = new IRISDataSource(); ds.setURL(dbUrl); ds.setUser(user); ds.setPassword(pass); Connection dbconnection = ds.getConnection(); System.out.println("Connected to InterSystems IRIS via JDBC."); } }
文章
Michael Lei · 九月 12, 2022

分析InterSystems开发者社区的的开放应用

针对InterSystems开发者社区的分析。使用InterSystems IRIS BI (DeepSee)、Power BI和Logi Report Designer制作的项目,可视化并分析InterSystems 开发者社区上的成员、文章、问题、答案、观点和其他内容和活动。 你可以看到自己的活动、文章和问题。跟踪你的贡献如何改变开发者社区。 使用IRIS BI、Adaptive Analytics、InterSystems Reports、Tableau和Power BI分析关于你和你朋友的统计数据。 该项目包含预配置的IRIS和Atscale在Docker容器中的部署以及BI系统的项目文件。 更多细节信息请见相应应用的README。 这个项目也支持在线部署,你可以在这里查看。
公告
Claire Zheng · 九月 19, 2022

轻而易举!来InterSystems Ideas为你的想法分类吧!

开发者社区的同学们,大家好! 在 之前的公告 中,我们向大家介绍了InterSystems官方反馈门户 InterSystems Ideas! 今天想给大家介绍更多,尤其是涉及到的主题。 你可以按以下主题类别提交你的想法: 💡 InterSystems Products(InterSystems产品) 在这里,您可以在这里发布与我们产品发展相关的创意和想法: InterSystems IRIS数据平台 InterSystems IRIS for Health(医疗版)数据平台 InterSystems HealthShare InterSystems TrakCare 💡 InterSystems Services(InterSystems服务) 您可以在这里发表如何使我们的服务变得更好的想法: Developer Community (开发者社区) Open Exchange app gallery(Open Exchange应用库) Global Masters gamification platform(Global Masters游戏平台) Partner Directory(供应商目录) Documentation(文档) Certification(认证) Learning (学习) 以及InterSystems Ideas Portal 还有一个主题类别是 "Other(其他)" ,如果您的创意和想法与上述两类不直接相关,可以放在这个类别下。 选择好类别(Category)后,您也可以自由添加合适的关键字/标签: 如果您认为还有哪些类别和关键字值得被添加到这里,欢迎随时与我们分享! 点击一下,来 InterSystems Ideas portal 提出你的意见和建议吧✌️
公告
Claire Zheng · 七月 30, 2021

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

亲爱的社区开发者们,大家好! 我们真诚邀请您参加 Online Meetup:InterSystems 开发者竞赛(人工智能与机器学习)! 时间: 2021年7月30日(周五) 11:00 AM (美东时间)23:00 (北京时间) 在这场在线Meetup,您将了解到: 此次优胜者的个人履历; 获奖Application的简短Demo; 有关应用技术的开放探讨、问答,以及下次竞赛的一些计划。 我们的发言人名单: @José.Pereira, BI开发者,Shift Consultoria e Sistemas Ltda @Henrique.GonçalvesDias, 系统管理专员/数据库管理员, Sao Paulo Federal Court @Oleh.Dontsov, 全栈开发工程,Tax Sketches SRO @Aleksandr.Kalinin6636, 工程师, LLC "Escape" @Renato.Banzai, 机器学习工程师,Itaú Unibanco @Evgeny.Shvarov, InterSystems 开发者生态经理(Developer Ecosystem Manager) @Thomas.Dyar, InterSystems 产品专家(机器学习) @Raj.Singh5479, InterSystems 产品经理( 开发者体验) @Robert.Kuszewski, InterSystems 产品经理( 开发者体验) 欢迎您在这个特别的会议上与我们的开发人员沟通、交流! ➡️ 注册参会!
公告
Michael Lei · 十二月 30, 2021

第三方合作伙伴产品展示:InterSystems IRIS的“新”监控工具

亲爱的女士们和先生们,在上个月,我改进了我的工具Caché监视器......但首先:名字 选择Caché Monitor这个名字是为了反映该工具与Caché数据库的紧密结合。我想,在可预见的未来,Intersystems Caché这个既定名称很可能会被InterSystems IRIS数据平台完全取代。因此,重塑品牌的步骤成为必要。为了在未来不那么紧密地与一个产品名称联系在一起,我们选择了一个更加中立的新名字: SQL Data Lens 不管叫什么名字,实现与Intersystems产品最紧密的整合仍然是我们的目标。持续的发展也反映在版本号的延续上。上一个版本是Caché Monitor 2.96,下一个版本是SQL Data Lens 3.0。 但这不仅仅是重新命名,而且还集成了许多新的功能,例如 一个很大的进步是,SQL Data Lens现在是基于Java Runtime Environment 11的,有了它,就可以改善对HiDPI的支持。在操作系统层面上配置了系统规模因素,支持每台显示器的DPI! 但也集成了一个新的现代的Flat 外观和Feel 集成,在亮Light和暗Dark两种模式下。 SQL DataLens带有一个最小化的私有JRE(基于JetBrains JDK 11)。 ...等等 请随时从以下网站下载并测试SQL Data Lens,无需任何注册: https://sqldatalens.com/ 我期待着你的经验,建议和想法,这些都非常欢迎。 谢谢您的关注! Andreas https://sqldatalens.com/从链接进去下载不了 我刚试了一下是可以的,而且不用翻墙,看看是否本地浏览器或者其他问题?谢谢! https://sqldatalens.com/download/ 点击download之后,会跳到https://sqldatalens.com/sqldl_files/latest/SQLDataLens_308_20220508.zip这个链接,提示“ Server Error 403 Forbidden ” 那可能得麻烦您到英文社区下面问下,这是我们德国合作伙伴做的:https://community.intersystems.com/post/new-tool-intersystems-iris, 谢谢!
文章
jieliang liu · 九月 23, 2021

IRIS 2021 技术文档 First Look 19 使用 InterSystems 产品优化 SQL 性能

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; } .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 { height: auto; margin-top: 16px; margin-bottom: 16px; } .md-require-zoom-fix foreignObject { font-size: var(--mermaid-font-zoom); } .md-fences.md-fences-math { font-size: 1em; } .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; } .md-inline-math-container mjx-container { zoom: 0.95; } .CodeMirror { height: auto; } .CodeMirror.cm-s-inner { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-scroll { overflow: auto hidden; z-index: 3; } .CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); } .CodeMirror-gutters { border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; white-space: nowrap; background-position: inherit; background-repeat: inherit; } .CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); } .cm-s-inner .cm-keyword { color: rgb(119, 0, 136); } .cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); } .cm-s-inner .cm-number { color: rgb(17, 102, 68); } .cm-s-inner .cm-def { color: rgb(0, 0, 255); } .cm-s-inner .cm-variable { color: rgb(0, 0, 0); } .cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); } .cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); } .cm-s-inner .cm-string { color: rgb(170, 17, 17); } .cm-s-inner .cm-property { color: rgb(0, 0, 0); } .cm-s-inner .cm-operator { color: rgb(152, 26, 26); } .cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); } .cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); } .cm-s-inner .cm-meta { color: rgb(85, 85, 85); } .cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); } .cm-s-inner .cm-builtin { color: rgb(51, 0, 170); } .cm-s-inner .cm-bracket { color: rgb(153, 153, 119); } .cm-s-inner .cm-tag { color: rgb(17, 119, 0); } .cm-s-inner .cm-attribute { color: rgb(0, 0, 204); } .cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); } .cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); } .cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); } .cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); } .cm-negative { color: rgb(221, 68, 68); } .cm-positive { color: rgb(34, 153, 34); } .cm-header, .cm-strong { font-weight: 700; } .cm-del { text-decoration: line-through; } .cm-em { font-style: italic; } .cm-link { text-decoration: underline; } .cm-error { color: red; } .cm-invalidchar { color: red; } .cm-constant { color: rgb(38, 139, 210); } .cm-defined { color: rgb(181, 137, 0); } div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); } div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); } .cm-s-inner .CodeMirror-activeline-background { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror { position: relative; overflow: hidden; } .CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-sizer { position: relative; } .CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; } .CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; } .CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; } .CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; } .CodeMirror-gutter-filler { left: 0px; bottom: 0px; } .CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; } .CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; border: none !important; background-position: 0px 0px !important; } .CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-lines { cursor: text; } .CodeMirror pre { border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; border-width: 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; word-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; background-position: 0px 0px; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-code pre { border-right-width: 30px; border-right-style: solid; border-right-color: transparent; width: fit-content; } .CodeMirror-wrap .CodeMirror-code pre { border-right-style: none; width: auto; } .CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right-style: none; width: 0px; } .CodeMirror div.CodeMirror-cursor { visibility: hidden; } .CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; } .cm-searching { background-color: rgba(255, 255, 0, 0.4); } span.cm-underlined { text-decoration: underline; } span.cm-strikethrough { text-decoration: line-through; } .cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); } .cm-tw-deleted { text-decoration: line-through; } .cm-tw-header5 { font-weight: 700; } .cm-tw-listitem:first-child { padding-left: 10px; } .cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; } .cm-tw-underline { text-decoration: underline; } @media print { .CodeMirror div.CodeMirror-cursor { visibility: hidden; } } :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; -webkit-font-smoothing: antialiased; } body { font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', 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 产品优化 SQL 性能使用 InterSystems SQL 优化查询使用 EXPLAIN 关键字显示查询计划在管理门户(Management Portal)中使用 SQL 查询接口显示查询计划发现查询计划结果中潜在的性能问题测试查询执行测试位片索引(Bitslice Index)的效果向交易类型字段(TransactionType Field)添加位图索引(Bitmap Index)重新测试查询性能查看随时间变化的查询性能了解有关 InterSystems SQL 的更多信息介绍材料 技术概要:使用 InterSystems 产品优化 SQL 性能 技术概要:使用 InterSystems 产品优化 SQL 性能 本技术概要(First Look)指南向您介绍了 InterSystems SQL 查询优化,包括查询分析工具的使用,几种索引方法以及随着时间的变化查看运行时统计数据的能力。 要浏览所有的技术概要(First Look),包括其他可以在免费的云实例或 web 实例上执行的技术概要(First Look),请参见 InterSystems First Looks(《InterSystems 技术概要》)。 使用 InterSystems SQL 优化查询 InterSystems IRIS®数据平台为 SQL 查询性能调整提供全套工具: 查询计划分析的图形化显示 如位图和位片索引(bitslice index)等索引策略结构紧凑,可由矢量化 CPU 指令有效处理。每种索引类型都为某些查询类型(如逻辑条件、计数和聚合函数)提供了好处。通过索引,您可以在一个核心上实现每秒多达数十亿行的查询性能结果。 随时间变化的 SQL 查询性能指标 重要提示: 下面演示中显示的查询性能数字代表了在一台 Windows 10 笔记本电脑上进行的多次演示试验。根据您的环境,您可能会看到不同的查询性能数字。 想查看 InterSystems IRIS SQL 功能快速演示吗?请查看 SQL QuickStart(SQL 快速入门)! 用前须知 阅读本文之前,建议阅读并完成 First Look:InterSystems SQL(《技术概要:InterSystems SQL》)。在这里,您将再次使用 InterSystems IRIS SQL Shell;您将使用的数据来自您在技术概要:InterSystems SQL的演示时创建的百万记录股票交易数据表。 您还将运行 TuneTableutility,它检查表中的数据并创建 InterSystems SQL 查询优化器(决定如何最好地运行任何查询的引擎)使用的统计数据。这些统计数据包括表的大小(区段大小)和每列唯一值的数量(选择性)。优化器在决定连接顺序等情况下使用表大小,其中最好从较小的表开始。在表有多个索引的情况下,选择性有助于优化器选择最佳索引。在产品实例中,您通常只运行一次 TuneTable:在数据被加载到表中之后和运行之前。 演示:显示和解释优化前的查询计划 First Look:InterSystems SQL (《技术概要:InterSystems SQL》)解释了如何执行在技术概要(First Look)和此处运行演示所需的以下步骤: 选择一个 InterSystems IRIS 实例。您的选择包括多种类型的已授权的和免费的评估实例;关于如何部署每种类型的信息,请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。 打开 InterSystems 终端(Terminal)(简称终端(Terminal))来运行 SQL Shell。 从 GitHub repo https://github.com/intersystems/FirstLook-SQLBasics 获取本指南的实用程序文件和数据,包括 stock_table_demo_two.csv,其中包含一百万行股票表数据 Loader.xml,是一个包含实用程序方法的类文件,用于将 Stock_table_demo_two.csv 中的数据加载到InterSystems IRIS 表中。 运行 TuneTable 实用程序 如果您的 InterSystems IRIS 实例不再包含 StockTableDemoTwotable,请按照 Demo:Using Bitmap Indexing To Maximize Query Performance(《演示:使用位图索引最大化查询性能》)(在执行 SELECT DISTINCT 查询之前停止)的前四个步骤重新创建并加载它。 在 SQL Shell 中,在 FirstLook.StockTableDemoTwo 上运行 TuneTable 实用程序,如下所示: OBJ DO $SYSTEM.SQL.TuneTable("FirstLook.StockTableDemoTwo") 该命令在 SQL Shell 中不会生成可见的输出。 使用 EXPLAIN 关键字显示查询计划 这个演示假设您想获得所有"SELL"交易的平均价格。鉴于该表包含一百万条记录,所需的查询有可能非常慢。 虽然您可能已经想在 Price 和 TransactionType 字段上创建索引,但在开始优化工作之前,查看查询计划将具有指导意义。在 SQL Shell 中,您可以通过在查询前添加 EXPLAIN 关键字来显示查询计划。查询计划显示 SQL 查询优化器将如何使用索引(如果有索引的话),或者是否将直接读取表数据来执行语句。 要使用 EXPLAIN 关键字来显示查询计划,在 SQL Shell 中执行以下语句: EXPLAIN SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' 这将返回格式为 XML 的查询计划: xxxxxxxxxx Plan "<plans> <plan> <sql> SELECT AVG ( Price ) AS AveragePrice FROM FirstLook . StockTableDemoTwo WHERE TransactionType = ? /*#OPTIONS {""DynamicSQLTypeList"":""1""} */ </sql> <cost value=""1827000""/> Call module B. Output the row. <module name=""B"" top=""1""> Process query in parallel, partitioning master map FirstLook.StockTableDemoTwo.IDKEY into subranges of T1.ID values, piping results to temp-file A: SELECT count(T1.Price),sum(T1.Price) FROM %NOPARALLEL FirstLook.StockTableDemoTwo T1 where ((%SQLUPPER(T1.TransactionType) = %SQLUPPER(?))) Read temp-file A, looping on a counter. For each row: Accumulate the count([value]). Accumulate the sum([value]). </module> 演示:显示和解释优化前的查询计划 </plan> <plan> <sql> SELECT COUNT ( T1 . Price ) , SUM ( T1 . Price ) FROM %NOPARALLEL FirstLook . StockTableDemoTwo T1 WHERE ( ( %SQLUPPER ( T1 . TransactionType ) = %SQLUPPER ( ? ) ) ) %PARTITION BY T1 . ID > ? AND T1 . ID <= ? </sql> <cost value=""1827000""/> Call module B. Output the row. <module name=""B"" top=""1""> Read master map FirstLook.StockTableDemoTwo.IDKEY, looping on ID (with a range condition). For each row: Accumulate the count(Price). Accumulate the sum(Price). </module> </plan> </plans>" 您将看到为执行 SQL 查询而生成的查询计划可以分为多个模块,每个模块都执行计划的不同部分,例如评估子查询。 实际上,这个查询计划被分为两个独立的计划。顶部计划用于初始查询。它调用一个模块 B,在这个模块中,其中"主映射"被分区,并在每个分区上并行执行子查询。子查询的计划遵循初始查询的计划。 在 "Spotting Potential Performance Issues in Query Plan Results(在查询计划结果中发现潜在的性能问题)"中,您将学习如何识别这个查询的问题。 在管理门户(Management Portal)中使用 SQL 查询接口显示查询计划 InterSystems IRIS 在管理门户(Management Portal)中提供了一个基于 web 的接口,用于 SQL 查询执行和计划分析。要使用管理门户(Management Portal)中的 SQL 查询接口显示查询计划: 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在浏览器中打开您的实例的管理门户(Management Portal)。 请确保您是在 USER 命名空间。 如果您还没有找到,可以: 在屏幕的顶部面板中,点击当前命名空间名称右侧的 SWITCH(交换)。 在弹出的窗口中,选择 USER(用户) 并点击 OK(确定)。 导航到 SQL 页面(System Explorer(系统资源管理器) > SQL)。 省略 EXPLAIN 关键字,将"Using the EXPLAIN Keyword to Show a Query Plan(使用 EXPLAIN 关键字显示查询计划)中的查询粘贴到 Execute Query(执行查询) 标签的文本字段中。 点击 Show Plan(显示计划) 来显示查询计划。 结果将如下所示: 解释这些结果是下一节的主题。 发现查询计划结果中潜在的性能问题 查看查询计划结果,您可以看到这个查询存在一些严重的潜在性能问题。如果您查看子查询的计划,也就是实际工作完成的地方,您可以看到第一个任务是 "读取主映射"。这意味着 InterSystems SQL 查询优化器不会使用任何索引来运行查询; 演示:测试查询优化 相反,查询将遍历表中的所有 ID。特别是在大表的情况下,这表明查询将不能很好地执行。 当您优化查询时,您会看到它的执行时间减少,查询计划也会有明显的变化。 注意: 相对成本可以很好地预测性能,但只是相对于某个特定的查询而言。如果您在表中添加了一个索引,并且看到相对成本下降了,那么很可能这个查询现在会运行得更快。然而,相对成本并不是为了比较两个不同查询的性能。 测试查询执行 要获取有关未优化查询将如何执行的一些实际数据,请在 SQL Shell 中运行它: SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' GO 输出将如下所示: xxxxxxxxxx AveragePrice 266.1595139195757844 1 Rows(s) Affected statement prepare time(s)/globals/cmds/disk: 0.0009s/6/1246/0ms execute time(s)/globals/cmds/disk: 0.2599s/1000075/8502571/0ms cached query class: %sqlcq.USER.cls5 语句准备和执行指标分别列出。特别注意以下两项: 执行时间为 0.2599 秒。虽然这个时间看起来并不算长,但可以通过使用索引大大改善。 在执行步骤中读取的 globals 数量为 1,000,075。(Globals 是 InterSystems IRIS 用来存储数据的多维稀疏数组(multidimensional sparse arrays);更多信息,请参见 Introduction to InterSystems IRIS Programming(《InterSystems IRIS 编程简介》)中的Introduction to Globals(Globals 简介)一章。为了提高查询性能,应该减少这个数字。您会在下一节看到这种情况。 重要提示: 准备工作只需一次:第一次重新规划查询。如果修改了相关表或添加或删除了索引,查询将自动重新规划。大多数应用程序只准备一次查询,但会多次执行。因此,在这个演示中,我们的重点将是调整执行性能。 演示:测试查询优化 向价格字段添加位片索引(Bitslice Index) 如果您的查询将包含一个或多个字段上的聚合函数,那么为这些字段中的一个或多个字段添加位片索引(bitslice index)可能会提高性能。 位片索引(bitslice index)将字段中的每个数字数据值表示为二进制位字符串,二进制值中的每个数字都有一个位图,以记录哪些行的二进制数字为 1。 因为我们想要获得所有"SELL"交易的平均价格,所以在 Price 字段中添加一个位片索引(bitslice index)是有意义的。要在 Price 字段上创建位片索引(bitslice index) PriceIdx,请在 SQL Shell 中执行以下语句: 演示:测试查询优化 CREATE BITSLICE INDEX PriceIdx ON TABLE FirstLook.StockTableDemoTwo (Price) CREATE BITSLICE INDEX PriceIdx ON TABLE FirstLook.StockTableDemoTwo (Price) xxxxxxxxxx 0 Rows Affected statement prepare time(s)/globals/cmds/disk: 0.0091s/2000/13151/0ms execute time(s)/globals/cmds/disk: 1.4268s/2087789/55765062/1ms cached query class: %sqlcq.USER.cls7 但是,正如您将在下面看到的,仅仅因为您创建了索引并不一定意味着 InterSystems SQL 查询优化器会使用它 。 测试位片索引(Bitslice Index)的效果 要查看新的位片索引(bitslice index)是否会对查询的执行方式或运行速度产生任何影响,请使用上述任何一种方法(SQL Shell 或管理门户(Management Portal))来显示查询计划。 正如您将看到的,查询计划仍然与以前相同。InterSystems SQL 查询优化器将不会使用新的索引。 运行查询产生的性能统计数据与您创建位片索引(bitslice index)之前几乎相同(0.2559 秒的执行时间与 0.2599 秒相比)。InterSystems IRIS 智能地缓存查询计划和数据,因此同一查询的后续运行可能会提高性能,鉴于查询性能时间略有不同,这里可能就是这种情况。 在机器上运行的其他应用程序也会影响性能。 SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' GO SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' xxxxxxxxxx AveragePrice 266.1595139195757844 1 Rows(s) Affected statement prepare time(s)/globals/cmds/disk: 0.0569s/35431/227191/0ms execute time(s)/globals/cmds/disk: 0.2559s/1000075/8502571/0ms cached query class: %sqlcq.USER.cls8 如果从查询中删除 WHERE 子句,当您显示查询计划时,将会看到完全不同的结果: 如您所见,读取位片索引(bitslice index)是查询计划的第一步。在这个计划中没有读取到"总映射"。 SQL 查询优化器也使用第二个索引 FirstLook.StockTableDemoTwo.$StockTableDemoTwo。这是位图范围索引, 在执行 CREATE TABLESQL 语句时自动创建。它是表中所有行的位图索引(bitmap index),而不仅仅是一个字段,每个位的值反映了该行是否实际存在。 演示:测试查询优化 然而,我们真正想要运行的查询包含一个 WHERE 子句。因此,我们必须找到一种方法,让 SQL 查询优化器在 WHERE 子句存在时使用索引。 向交易类型字段(TransactionType Field)添加位图索引(Bitmap Index) 如果您阅读了 InterSystems SQL Optimization Guide(《InterSystems SQL 优化指南》),您会发现 InterSystems SQL 查询优化器在与 WHERE 子句字段上的位图索引(bitmap index)结合使用时,通常会使用位片索引(bitslice index)。 这是因为没有 WHERE 子句的聚合查询可以简单地聚合索引中的所有数据。然而,为了只聚合满足 WHERE 条件的行,查询必须掩码那些不满足条件的行的位片索引(bitslice index)的位。在 WHERE 子句中的字段上有一个位图索引(bitmap index),允许有效地构建这个掩码。 幸运的是,查询中的另一个字段 TransactionType 是位图索引(bitmap index)的一个很好的候选者,因为它的可能值计数是两个("SELL"和"BUY")。 要向 TransactionType 字段添加位图索引(bitmap index),请在 SQL Shell 中执行以下语句: CREATE BITMAP INDEX TransactionTypeIdx ON TABLE FirstLook.StockTableDemoTwo (TransactionType) CREATE BITMAP INDEX TransactionTypeIdx ON TABLE FirstLook.StockTableDemoTwo (TransactionType) xxxxxxxxxx 0 Rows Affected statement prepare time(s)/globals/cmds/disk: 0.0069s/2001/13291/0ms execute time(s)/globals/cmds/disk: 1.1046s/2088960/19771584/0ms cached query class: %sqlcq.USER.cls7 重新测试查询性能 现在,您已经添加了位片索引(bitslice index)和位图索引(bitmap index):如果您显示的查询计划 SELECT AVG(Price) as AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' 在 SQL Shell 或管理门户(Management Portal)中,您会看到查询优化器使用您创建的两个索引来获得最佳性能。 还请注意,18742 的相对成本只是未优化查询的一小部分,其成本为 1827000。 演示:测试查询优化 最后,如果您在 SQL Shell 中运行这个查询,您会看到对 globals 的更有效使用(594 而不是 1000075)。 最关键的是,有索引的查询运行速度比无索引的查询快了近 85 倍(执行时间为 0.0031 秒,而非 0.2599)。 查看随时间变化的查询性能 SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' GO SELECT AVG(Price) As AveragePrice FROM FirstLook.StockTableDemoTwo WHERE TransactionType = 'SELL' xxxxxxxxxx AveragePrice 266.1595139195757844 1 Rows(s) Affected statement prepare time(s)/globals/cmds/disk: 0.0554s/34877/186130/0ms execute time(s)/globals/cmds/disk: 0.0031s/594/2878/0ms cached query class: %sqlcq.USER.cls8 为了随时间跟踪查询的性能,InterSystems IRIS 提供了查询统计数据,您将在下一节了解如何查看这些数据。 查看随时间变化的查询性能 要跟踪运行缓慢的查询或查看新查询在产品中的运行情况,您可以使用管理门户(Management Portal)中的 SQL Statements(SQL 语句)视图。要导航到这个视图,在管理门户(Management Portal)中打开 SQL 查询接口,并点击 SQL Statements(SQL语句)。 例如,如果您上面调整的查询在其原始(未优化的)计划下运行了 9 次,您可能会看到类似这样的结果: 点击 SQL Statement Text column(SQL 语句文本列)中的语句链接, 允许您以 SQL 形式查看查询: 您还可以使用缓存查询类的名称将 SQL 语句执行与 SQL Statements(SQL 语句)视图联系起来,该名称是 SQL Shell 中输出的最后一行,并列在 SQL Statements(SQL 语句) 的 Location(s)(位置)列中。 在您优化查询并运行几次后,您可以期望看到 Total time(总时间)和 Average time(平均时间)的改善列。 了解有关 InterSystems SQL 的更多信息 请注意,Count(计数)的值已经下降。这是因为位图和位片索引(bitslice index)的添加引起了查询计划的改变,这反过来又触发了对相关类的缓存查询的删除。该查询在新查询计划下总共运行了 8 次,平均每天 4 次。 了解有关 InterSystems SQL 的更多信息 要了解更多有关 SQL 和 InterSystems IRIS 的信息,请参见: 介绍材料 First Look:InterSystems SQL(《技术概要:InterSystems SQL》) Using InterSystems SQL(《使用 InterSystems SQL》) InterSystems SQL Reference(《InterSystems SQL 参考书目》) InterSystems SQL Overview(《InterSystems SQL 概述》) SQL 开发 SQL -- Things You Should Know(《SQL -- 您应该知道的事情》) Developing with InterSystems Objects and SQL(《使用 InterSystems Objects 和 SQL 开发》) 查询优化 InterSystems SQL Optimization Guide(《InterSystems SQL 优化指南》) Optimizing SQL Queries(《优化 SQL 查询》) 分片和可扩展性 First Look:Scaling for Data Volume with Sharding(《技术概要:带分片的数据卷扩展》) Scalability Guide(《可扩展性指南》) SQL 搜索 First Look:SQL Search with InterSystems IRIS(《技术概要:使用 InterSystems IRIS 进行 SQL 搜索》) Using InterSystems SQL Search(《使用 InterSystems SQL 搜索》) Creating iFind Indices for Searching Text Fields(《创建用于搜索文本字段的 iFind 索引》) JDBC First Look:JDBC and InterSystems IRIS (《技术概要:JDBC 和 InterSystems IRIS》) Using Java JDBC with InterSystems IRIS(《在 InterSystems IRIS 中使用 Java JDBC》)<文档> Java Overview (《Java 概述》) 了解有关 InterSystems SQL 的更多信息 Using JDBC with InterSystems IRIS(《在 InterSystems IRIS 中使用 JDBC》) <在线学习>
文章
jieliang 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 概述》)
文章
Hao Ma · 十一月 2, 2021

IRIS 2021 技术文档 First Look 13 - InterSystems IRIS Native API for Java

本文档解释了如何使用 InterSystems IRIS Native 功能从 Java 应用程序中访问 InterSystems IRIS®数据平台的 globals。在本文中,您将首先连接到 InterSystems IRIS。然后您将在 InterSystems IRIS 中设置和检索一个 global 节点的值,并在另一个 global 节点上进行迭代。您还将调用 InterSystems IRIS 类方法。所有这些活动都将在 Java 应用程序中执行。为了让您体验 IRIS Native,而又不陷入细节困境,本次探索特意设计得很简单。这些活动被设计成只使用默认设置和功能,这样您就可以熟悉功能的基本原理,而不必处理那些离题或过于复杂的细节。当您把 IRIS Native 引入您的生产系统时,您可能需要做一些不同的事情。请确保不要把这种对 IRIS Native 的探索与真实的情况相混淆! 本文档末尾提供的参考资料将使您对在生产中使用 IRIS Native 的情况有一个很好的了解。要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 1 Globals 简介Globals 提供了一种易于使用的方式,来存储持久化多维数组中的数据。Global 是存储在 InterSystems IRIS 物理数据库中的命名多维数组。在应用程序中,globals 到物理数据库的映射基于当前命名空间,命名空间提供一个或多个物理数据库的逻辑统一视图。例如,要使用一个名为 ^Settings 的 global 将值 "Red"与键 "Color"关联起来,请使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础: 连接一个 IDE》)中的procedure described for your instance(为您的实例描述的程序),打开 InterSystems 终端(InterSystems Terminal),并输入以下代码:set ^Settings("Color")="Red" 您可以利用 globals 的多维特性来定义一个更复杂的结构: set ^Settings("Auto1","Properties","Color") = "Red" set ^Settings("Auto1","Properties","Model") = "SUV" set ^Settings("Auto2","Owner") = "Mo"set ^Settings("Auto2","Properties","Color") = "Green" 有关 globals 的更多信息,请参见 Using Globals(《使用 globals》)。 2 为什么 IRIS Native 很重要?IRIS Native 是建立在 InterSystems IRIS JDBC 功能之上的一项功能,它允许您执行核心类 ObjectScript 命令的有限子集,并使用 globals 访问 InterSystems IRIS 数据,类似于在 InterSystems 终端(InterSystems Terminal)中使用的方式。该功能利用 JDBC 连接(JDBC connection)在 Java 应用程序中暴露(expose)核心 ObjectScript 功能。重要的是,由于 IRIS Native 使用与 JDBC 相同的连接,因此 InterSystems IRIS 数据通过 JDBC 作为关系表暴露(expose)给 Java 应用程序,通过 IRIS Native 作为 globals 暴露(expose)给 Java 应用程序。 探索 IRIS Native InterSystems IRIS 提供了一组独特的功能,可以使用相同的物理连接和事务环境来使用多个范例(本机、关系和面向对象)操作数据。 3 探索 IRIS Native以下向您简短演示如何在 Java 应用程序中使用 IRIS Native。(想试试 InterSystems IRIS Java 开发和互操作性功能的在线视频演示吗?请看 Java QuickStart(Java快速入门)!) 3.1 用前须知要使用该程序,您需要在一个系统上工作,安装 JDK 1.8 版本和您选择的 Java IDE,并连接一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种已授权的和免费的评估实例;实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。使用同一文档中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)和 Java IDE 中的信息,将 IDE 连接到您的 InterSystems IRIS 实例。您还需要将 InterSystems IRIS JDBC 驱动程序 intersystems-jdbc-3.0.0.jar 添加到您的本地 CLASSPATH。您可以从https://github.com/intersystems/quickstarts-java/tree/master/lib下载这个文件。如果您已经在本地系统或您能访问的另一个系统上安装了 InterSystems IRIS,您可以在 install-dir\dev\java\lib\JDK18 中找到该文件,其中 install-dir 是 InterSystems IRIS 的安装目录。3.2 连接 InterSystems IRIS InterSystems IRIS 连接字符串的语法是:jdbc:IRIS://host_IP:superserverPort/namespace,username,password其中的变量表示在 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中connection settings described for your instance(为您的实例描述的连接设置)——这与您将 IDE 连接到实例时使用的信息相同。将命名空间设置为预定义的命名空间 USER,如下面的代码所示,或者设置为您在安装的实例中创建的另一个命名空间(只要您更新代码)。如果您连接到本地 Windows 系统上的实例(使用主机名 localhost 或 IP 地址 127.0.0.1),该连接会自动使用一种特殊的、高性能的本地连接,称为shared memory connection(共享内存连接),它为 IRIS Native 提供了更好的性能。有关更多信息,请参见 First Look:JDBC and InterSystems IRIS(技术概要: JDBC 和 InterSystems IRIS)。3.3 使用 IRIS Native现在,您已经准备好试验 IRIS Native 了。在您已连接的 IDE 中(请参见 “用前须知”),创建一个名为 IRISNative 的新 Java 项目,并粘贴以下代码。确保编辑变量superserverPort(超级服务端口)、username(用户名)、namespace(命名空间)和password(密码),以反映您实例的正确值。import java.sql.DriverManager;import com.intersystems.jdbc.IRISConnection; import com.intersystems.jdbc.IRIS;import com.intersystems.jdbc.IRISIterator; public class IRISNative {protected static int superserverPort = 00000; // YOUR PORT HERE protected static String namespace = "USER"; 探索 IRIS Native protected static String username = "_SYSTEM"; protected static String password = "SYS";public static void main(String[] args) { try {// open connection to InterSystems IRIS instance using connection string IRISConnection conn = (IRISConnection) DriverManager.getConnection("jdbc:IRIS://localhost:"+superserverPort+"/"+namespace,username,password);// create IRIS Native objectIRIS iris = IRIS.createIRIS(conn); System.out.println("[1. Setting and getting a global]");// setting and getting a global// ObjectScript equivalent: set ^testglobal("1") = 8888 iris.set(8888,"^testglobal","1");// ObjectScript equivalent: set globalValue = $get(^testglobal("1")) Integer globalValue = iris.getInteger("^testglobal","1");System.out.println("The value of ^testglobal(1) is " + globalValue); System.out.println(); System.out.println("[2. Iterating over a global]");// modify global to iterate over// ObjectScript equivalent: set ^testglobal("1") = 8888// ObjectScript equivalent: set ^testglobal("2") = 9999 iris.set(8888,"^testglobal","1");iris.set(9999,"^testglobal","2");// iterate over all nodes forwardsIRISIterator subscriptIter = iris.getIRISIterator("^testglobal"); System.out.println("walk forwards");while (subscriptIter.hasNext()) {String subscript = subscriptIter.next(); System.out.println("subscript="+subscript+", value="+subscriptIter.getValue());}System.out.println();System.out.println("[3. Calling a class method]");// calling a class method// ObjectScript equivalent: set returnValue = ##class(%Library.Utility).Date(5) String returnValue = iris.classMethodString("%Library.Utility","Date",5); System.out.println(returnValue);System.out.println();// close connection and IRIS object iris.close();conn.close();} catch (Exception ex) { System.out.println(ex.getMessage());}}} 示例代码分为三个部分:1. 第一部分展示了如何设置一个 global 值以及稍后如何检索它。这部分里面执行的命令等同于 ObjectScript 的 SET 和 GET 命令。2. 第二部分展示了如何迭代 global 的子节点(subnode),类似于 $ORDER ObjectScript 函数。3. 第三部分展示了如何使用 IRIS Native 从您的 Java 应用程序调用 ObjectScript 类方法(class method)。 如果示例执行成功,您应该会看到带有示例代码结果的输出: 了解有关 IRIS Native 的更多信息 [1.Setting and getting a global] The value of ^testglobal(1) is 8888[2.Iterating over a global] walk forwardssubscript=1, value=8888 subscript=2, value=9999[3.Calling a class method] Jan 30, 2018 3.4 确认管理门户(Management Portal)的变更接下来,使用以下程序在管理门户(Management Portal)中确认您的结果。1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在浏览器中打开您实例的管理门户(Management Portal)。2. 如果您不在代码指定的命名空间中,请切换到该命名空间。3. 导航到 Globals 页面(System Explorer(系统资源管理器) > Globals)。您应该会看到在示例代码中创建的 testglobal。点击 View(查看) 来查看其内容。 您应该会看到 global 的两个节点:^testglobal(1) = 8888 和^testglobal(2) = 9999。 4 了解有关 IRIS Native 的更多信息有关 IRIS Native、globals 和 InterSystems IRIS 的更多信息,请参见:First Look:JDBC and InterSystems IRIS(《技术概要:JDBC 和 InterSystems IRIS》)Using Globals(《使用 Globals》)Using the Native API for Java(《使用 Native API for Java》)
文章
Hao Ma · 十一月 2, 2021

IRIS 2021 技术文档 First Look 18 - 在 InterSystems 产品中开发 REST 接口

本文档将向您展示如何开发 REST 接口。您可以将这些 REST 接口与 UI 工具(如 Angular)一起使用,以提供对数据库和互操作性产品的访问。您也可以使用它们支持外部系统访问 InterSystems IRIS®数据平台应用程序。要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 1 为什么提供 REST 接口如果您需要从外部系统访问 InterSystems IRIS 数据库中的数据,或者想为这些数据提供用户界面,您可以通过定义 REST 接口来实现。REST——REpresentational State Transfer——是一种使用公开的 URL 从另一个系统检索、添加、更新或删除数据的方法。REST 基于 HTTP,并使用 HTTP 动词 POST、GET、PUT 和 DELETE 映射到数据库应用程序常见的创建、读取、更新和删除 (CRUD)功能。您还可以在 REST 中使用其他 HTTP 动词,如 HEAD、PATCH 和 OPTIONS。REST 是在应用程序之间共享数据的众多方式之一,因此,如果您选择直接使用其他协议,如 TCP、SOAP 或 FTP 进行通信,则您可能并不总是需要设置 REST 服务。但是使用 REST 有以下优点:• REST 通常只有一个很小的开销(overhead)。它通常使用 JSON,这是一个轻量级的数据包装器。JSON 使用标签标识数据,但标签未在正式模式定义中指定,也没有显式的数据类型。REST 通常比 SOAP 更易于使用,SOAP 使用 XML 且开销(overhead)更大。• 通过在 REST 中定义一个接口,可以很容易地将客户端和数据库服务器之间的依赖关系降到最低。这使您可以在不影响数据库实现的情况下更新用户界面。您还可以在不影响用户界面或访问 REST API 任何外部应用程序的情况下更新数据库实现(database implementation)。 2 对 InterSystems IRIS 的 REST 调用 在定义 REST 接口之前,您应该了解 REST 调用如何流经 InterSystems IRIS。首先,考虑 REST 调用的部分,如:GET http://localhost:52773/rest/coffeemakerapp/coffeemakers 这由以下部分组成:• GET——这是 http 动词。• http:——这指定了通信协议。• //localhost:52773——这指定了托管 REST 接口的 InterSystems IRIS 实例的服务器和端口号。 如何在 InterSystems IRIS 中定义 REST 接口 • /rest/coffeemakerapp/coffeemakers——这是 URL 的主要部分,标识了 REST 调用所指向的资源。在下面的讨论中,URL 指的是 REST 调用的这一部分。 注意: 尽管这个技术概要(First Look)使用安装了 InterSystems IRIS 的 Web 服务器(在本例中是在本地系统的端口 52773 上),但对于部署的任何代码,您都应该使用一个商业 Web 服务器来替换它。安装 InterSystems IRIS 的 web 服务器仅供开发代码时临时使用,并不具备商业 web 服务器的强大功能。 当客户端应用程序进行 REST 调用时:1. InterSystems IRIS 将它指向与 URL 对应的 web 应用程序。例如,以 /coffeemakerapp 开头的 URL 将被发送到处理咖啡机的应用程序,以 /api/docdb 开头的 URL 将被发送到处理文档数据模型(Document Data Model)的 web 应用程序。2. Web 应用程序根据 HTTP 动词(verb)和 URL 中标识 web 应用程序的部分之后的任何部分,将调用指向一个方法。它通过将动词(verb)和 URL 与称为 URLMap 的结构进行比较来实现这一点。3. 该方法使用 URL 来标识 REST 调用所指定的资源,并根据动词(verb)来执行操作。例如,如果动词(verb)是 GET,该方法返回关于资源的一些信息;如果动词(verb)是 POST,该方法创建一个新的资源实例;如果动词(verb)是 DELETE,该方法删除指定资源。对于 POST 和 PUT 动词(verb),通常有一个提供更多信息的数据包。4. 该方法执行所请求的操作,并向客户端应用程序返回一个响应信息。 REST 调用需要执行方法和访问数据所需的任何权限。用户或 web 应用程序都可以拥有这些权限。您可以把这些权限分配给角色,然后把角色分配给用户或 web 应用程序。在这个示例中,%All 角色被分配给 web 应用程序。这允许未知用户(未经身份认证)访问 coffeemakerapp 数据。如果您没有把这个角色分配给 web 应用程序,未知用户将收到 401 未经授权的错误。您必须在 REST 身份认证调用中指定一个有足够权限的用户。详情请参见 "Securing REST Services(《确保 REST 服务》)"。 3 如何在 InterSystems IRIS 中定义 REST 接口在 InterSystems IRIS 中,有两种方法来定义 REST 接口:• 定义 OpenAPI 2.0 规范,然后使用 API 管理(API Management)工具来生成 REST 接口的代码。• 手动编码 REST 接口,然后在管理门户(Management Portal)中定义一个 web 应用程序。 本技术概要(First Look) 展示了如何手动编码 REST 接口,包括开发一个调度类(dispatch class)。如果您更喜欢使用规范优先的方法,这些调度类(dispatch class)是自动生成的,不应该被编辑。使用规范优先定义的优点包括能够从规范自动生成文档和客户端代码,但您可以使用任何一种方式来定义 REST 接口。有关使用规范定义 REST 接口的更多信息,请参见 Creating Rest Services(《创建 REST 服务》)。 4 手动编码 REST 接口 手动编码 REST 接口包括以下步骤:• 创建 %CSP.REST 的子类并定义 UrlMap。 手动编码 REST 接口 • 对处理 REST 调用的方法进行编码。• 定义 web 应用程序——您通常使用管理门户(Management Portal)来执行此操作。 本技术概要(First Look)使用了一个访问咖啡机数据库的示例应用程序 coffeemakerapp 来演示如何手动编码 REST 接口。Coffeemakerapp 提供 REST 接口来获取咖啡机的信息、在数据库中创建新的记录、更新现有的记录或删除记录。以下几节通过注释探讨了此示例应用程序的类定义和一些方法,以增强您对代码的理解。您将在完成本技术概要(First Look) 的练习部分后,从 GitHub 下载整个应用程序的代码。 4.1 创建 %CSP.REST 的子类并定义 URLMap 这是 demo.CoffeeMakerRESTServer 类定义的第一部分。它扩展了 %CSP.REST 类。 Class Demo.CoffeeMakerRESTServer Extends %CSP.REST{Parameter HandleCorsRequest = 1;XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]{<Routes><Route Url="/test" Method="GET" Call="test"/><Route Url="/coffeemakers" Method="GET" Call="GetAll" /><Route Url="/coffeemaker/:id" Method="GET" Call="GetCoffeeMakerInfo" /><Route Url="/newcoffeemaker" Method="POST" Call="NewMaker" /><Route Url="/coffeemaker/:id" Method="PUT" Call="EditMaker" /><Route Url="/coffeemaker/:id" Method="DELETE" Call="RemoveCoffeemaker"/></Routes>} 查看路由(Route)要素。每个都有三个属性:• Url——这标识了可由该路由(Route)处理的 REST URL。由于 IRIS 指向以 /rest/coffeemakerapp 开头的 URL,因此这个属性指定了紧随其后的 URL 部分。如果 Url 属性是 /cof- feemakers,则此路由( Route)处理以 /rest/coffeemakerapp/coffeemakers 开头的 URL。• Method(方法)——这标识了路由(Route)处理的动词。请注意,最后两行的 Url 值相同,/coffeemaker/:id。有 PUT 方法的路由(Route)将处理以 /rest/coffeemaker- app/coffeemaker/:id 开头的 URL 的 PUT 动词,有 DELETE 方法的路由(Route)将处理具有相同开头的 URL 的 DELETE 动词。• Call(调用)——指定要调用的方法来处理这个 REST 调用。该方法会被传递完整的 URL 和任何数据,以便它可以根据 URL 做出响应。 Url 值中以 : 开头的部分表示通配符。也就是说,/coffeemaker/:id 将匹配 /coffeemaker/5,/coffeemaker/200,甚至是 /coffeemaker/XYZ。被调用的方法将在参数中获得 :id 的值。在这种情况下,它标识了要更新(使用 PUT)或删除的咖啡机的 ID。Url 值有额外的选项,允许您将 REST URL 转发到 %CSP.REST 子类的另一个实例,但您不需要在这个技术概要(First Look)中处理它。HandleCorsRequest 参数指定浏览器是否应该允许跨源资源共享(Cross-origin Resource Sharing,CORS),即在一个域中运行的脚本试图访问在另一个域中运行的 REST 服务,但这也是一个高级主题。 4.2 编码方法 GetAll 方法检索有关所有咖啡机的信息。以下是其代码: 手动编码 REST 接口 ClassMethod GetAll() As %Status{Set tArr = []Set rs = ##class(%SQL.Statement).%ExecDirect(,"SELECT * FROM demo.coffeemaker") While rs.%Next() {Do tArr.%Push({"img": (rs.%Get("Img")), "coffeemakerID": (rs.%Get("CoffeemakerID")), "name": (rs.%Get("Name")),"brand": (rs.%Get("Brand")),"color": (rs.%Get("Color")),"numcups": (rs.%Get("NumCups")),"price": (rs.%Get("Price"))})}Write tArr.%ToJSON() Quit $$$OK} 此方法的注意事项:• 没有任何参数。每当这个方法被调用时,它就会执行一个 SQL 语句,从 demo.coffeemaker 数据库中选择所有记录。• 对于数据库中的每条记录,它都会将这些值作为名称、值对附加到数组中。• 它将数组转换为 JSON,并通过将 JSON 编写到 stdout 来将 JSON 返回给调用的应用程序。• 最后,它成功退出。 NewMaker() 方法没有参数,但有一个 JSON 有效负荷,用于指定要创建的咖啡机。以下是其代码:ClassMethod NewMaker() As %Status{If '..GetJSONFromRequest(.obj) {Set %response.Status = ..#HTTP400BADREQUEST Set error = {"errormessage": "JSON not found"} Write error.%ToJSON()Quit $$$OK}If '..ValidateJSON(obj,.error) {Set %response.Status = ..#HTTP400BADREQUEST Write error.%ToJSON()Quit $$$OK}Set cm = ##class(demo.coffeemaker).%New() Do ..CopyToCoffeemakerFromJSON(.cm,obj)Set sc = cm.%Save() Set result={}do result.%Set("Status",$s($$$ISERR(sc):$system.Status.GetOneErrorText(sc),1:"OK")) write result.%ToJSON()Quit sc} 此方法的注意事项:• 首先,它通过调用类中稍后定义的 GetJSONFromRequest() 和 ValidateJSON() 方法,测试有效负荷是否包含有效的 JSON 对象。• 然后它使用 JSON 对象创建一个新的 demo.coffeemaker,将记录保存在数据库中。• 它通过将状态写入 stdout 来返回状态。 最后,RemoveCoffeemaker() 方法展示了 Url 的:id部分是如何作为参数传递给该方法的: 为自己定义 REST 接口 ClassMethod RemoveCoffeemaker(id As %String) As %Status{Set result={}Set sc=0if id'="",##class(demo.coffeemaker).%ExistsId(id) { Set sc=##class(demo.coffeemaker).%DeleteId(id)do result.%Set("Status",$s($$$ISERR(sc):$system.Status.GetOneErrorText(sc),1:"OK"))}else {do result.%Set("Status","")}write result.%ToJSON() quit sc} 总之,由路由调用(Route Call)属性指定的方法通过以下方式处理 REST 调用:• 获得任何参数作为调用参数。• 通过 obj 值访问有效负荷。• 通过将响应写入 stdout,将其返回给客户端应用程序。 5 为自己定义 REST 接口本节逐步向您展示如何使用咖啡机应用程序来处理 REST 调用。与其让您编写 REST 接口的代码,不如从 GitHub 下载完成的应用程序。构建应用程序后,您将定义 Web 应用程序,然后通过 REST 调用测试应用程序。 5.1 用前须知要使用这个程序,您需要在一个系统上工作,安装一个 REST API 应用程序(如 Postman、Chrome 高级 REST 客户端(Chrome Advanced REST Client)或 cURL),并连接一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的 系统托管(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。有关将 REST API 应用程序连接到您的 InterSystems IRIS 实例所需的信息,请参见同一文档中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)。 5.2 下载示例应用程序通过克隆或下载已完成的 coffeemakerapp 应用程序来开始这个练习,该应用程序包括测试对 InterSystems IRIS 的 REST 调用所需的所有 REST 接口。这个技术概要-REST(FirstLook-REST)示例代码可以在以下网站获得:https://github.com/intersystems/FirstLook-REST。从 GitHub 下载的内容必须能从您的 InterSystems IRIS 实例访问。下载文件的程序取决于您所使用的实例类型,如下所示:• 如果您使用的是 ICM 部署的实例:1. 使用带有 -machine 和 -interactive 选项的 icm ssh 命令,在托管实例的节点上打开默认 shell,例如:icm ssh -machine MYIRIS-AM-TEST-0004 -interactive 为自己定义 REST 接口 2. 在 Linux 命令行上,使用以下命令之一将 repo 克隆到实例的数据存储卷(data storage volume)。例如,对于部署在 Azure 上的配置,数据卷的默认挂载点(default mount point)是 /dev/sdd,因此您可以使用如下命令: $ git clone https://github.com/intersystems/FirstLook-REST /dev/sdd/FirstLook-REST OR$ wget -qO- https://github.com/intersystems/FirstLook-REST/archive/master.tar.gz | tar xvz -C/dev/sdd 这些文件现在对容器文件系统上 /irissys/data/FirstLook-REST 中的 InterSystems IRIS 可用。 • 如果您正在使用通过其他方式部署的容器化实例(授权版或社区版(Community Edition)):1. 在主机上打开 Linux 命令行。(如果您在云节点上使用社区版(Community Edition),请使用 SSH 连接该节点,如在 Deploy and Explore InterSystems IRIS(《部署和探索 InterSystems IRIS》) 中所述。)2. 在 Linux 命令行上,使用 git clone 或 wget 命令,如上所述,将 repo 克隆到容器中挂载为卷的存储位置。– 对于社区版(Community Edition)实例,您可以克隆到实例的持久化 %SYS 目录 (存储指定于实例的配置数据的目录)。在 Linux 文件系统中,这个目录是 /opt/ISC/dur。这使得文件对容器文件系统上 /ISC/dur/FirstLook-REST 中的 InterSystems IRIS 可用。 – 对于已授权的容器化实例(containerized instance),选择容器中作为卷挂载的任何存储位置(如果使用它,包括持久化 %SYS 目录)。例如, 如果您的 docker run 命令包含选项 -v /home/user1:/external,并且您将 repo 克隆到 /home/user1,则文件对容器文件系统上 /external/FirstLook-REST 中的 InterSystems IRIS 可用。 • 如果您使用的是 InterSystems 学习实验室(Learning Labs)实例:1. 在集成 IDE 中打开命令行终端。2. 将目录更改为 /home/project/shared 并使用 git clone 命令克隆 repo: $ git clone https://github.com/intersystems/FirstLook-REST 该文件夹被添加到左边资源管理器(Explorer)面板的 Shared (共享)下,并且该目录对 /home/project/shared 中的 InterSystems IRIS 可用。• 如果您使用的是已安装的实例:– 如果实例的主机是安装了 GitHub 桌面(GitHub Desktop)和 GitHub 大文件存储(GitHub Large File Storage)的 Windows 系统:1. 在主机的 web 浏览器中进入 https://github.com/intersystems/FirstLook-REST。2. 选择 Clone or download(克隆或下载) 然后选择 Open in Desktop(在桌面上打开)。 这些文件对您的 GitHub 目录中的 InterSystems IRIS 可用,例如在 C:\Users\User1\Documents\GitHub\FirstLook-REST 中。– 如果主机是 Linux 系统,只需在 Linux 命令行上使用 git clone 命令或 wget 命令,就可以将 repo 克隆到您所选择的位置。 5.3 创建一个支持互操作性的命名空间如果您已经有了一个互操作性命名空间,就可以使用它。否则,创建一个命名空间:1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的 URL,在浏览器中打开您的实例的管理门户(Management Portal)。 为自己定义 REST 接口 2. 通过导航到命名空间(Namespaces)页面(System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间)), 并按照 System Administration Guide(《系统管理指南》)的“Configuring InterSystems IRIS(《配置 InterSystems IRIS》)”一章中创建/修改命名空间中的使用新命名空间(New Namespace)页面的说明,点击 Create New Namespace(创建新命名空间)按钮,创建一个支持互操作性的命名空间。 5.4 构建示例代码 要构建示例代码,请按照以下步骤操作1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的程序,打开 InterSystems 终端(Terminal)。2. 将命名空间设置为您将使用的互操作性命名空间。输入以下命令,替换 <Namespace-name> 与您所使用的命名空间。set $namespace = "<namespace-name>" 3. 输入以下命令,替换 <path> 与您下载示例的路径。 该目录包含许可证(License)和 Readme 文件以及 buildsample 目录:do $system.OBJ.Load("<path>/buildsample/Build.RESTSample.cls","ck") do ##class(Build.RESTSample).Build()4. 当出现提示时,输入下载此示例的目录的完整路径。然后,该方法加载和编译代码,并执行其他需要的设置步骤。注意: FirstLook-REST / README.md 文件包含这些说明的一个版本。5.5 定义一个 web 应用程序 现在您已经使用 REST 接口构建了示例应用程序,您需要定义一个 web 应用程序:1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的 URL,在浏览器中打开您的实例的管理门户(Management Portal)。2. 选择 System Administration(系统管理) > Security(安全) > Applications(应用程序) > Web Applications(web 应用程序)。3. 选择 Create New Web Application(创建新的 web 应用程序) 并输入以下设置• Name(名称): /Rest/coffeemakerapp——它指定了将由这个 web 应用程序处理的 URL。InterSystems IRIS 会将所有以 /rest/coffeemakerapp 开头的 URL 定向到这个 web 应用程序。• Namespace(命名空间): 您创建的支持互操作性的名称空间的名称。• Enable(支持): 选择 REST。• Dispatch Class(调度类): Demo.CoffeeMakerRESTServer——这是定义了 URLMap 的类。• Security Settings/Allowed Authentication Methods(安全设置/允许的身份认证方法): 同时选择 Unauthenticated(未经身份认证) 和 Password(密码) 复选框。4. 选择 Save(保存)。5. 要允许此示例的未经身份认证的访问,必须赋予 web 应用程序 %All 角色。要执行此操作:a. 选择 Save(保存)后,选择 Application Roles(应用程序角色)标签。b. 从 Available(可用的)角色中选择 %All 角色。c. 点击右箭头(选择)按钮,将 %All 角色移动到 Selected(选定的) 角色。 为自己定义 REST 接口 d. 点击 Assign(分配) 按钮。e. %All 角色现在被列为 Application Role(应用程序角色)。这确保了来自未经身份认证用户的 REST 调用将拥有访问 coffeemakerapp 数据所需的权限。如果没有这个角色,REST 调用将必须为拥有足够权限的用户指定身份认证。 5.6 访问 REST 接口 CoffeeMaker REST 应用程序现在可以工作了。您将输入 REST 命令来访问咖啡机数据库。在您的 REST API 工具(如 Postman)中,按照以下步骤操作:1. 指定 REST POST 请求来添加新的咖啡机,必要时使用您的 InterSystems IRIS 实例的指定信息• HTTP 操作: POST• URL: http://server:port/rest/coffeemakerapp/newcoffeemaker,其中服务器和端口是您的实例的主机标识符和 web 服务器端口。• 您的实例的登录凭证。• 输入数据: {"img":"img/coffee3.png","coffeemakerID":"99","name":"Double Dip","brand":"Coffee+", "color":"Blue","numcups":2,"price":71.73} 尽管数据包含一个 coffeemakerID 的值,但这是一个计算字段,并且在添加记录时会分配一个新值。该调用返回成功状态:{"Status":"OK"} 2. 重复上一步骤两次,添加以下两个咖啡机: {"img":"img/coffee4.png","coffeemakerID":"99","name":"French Press","brand":"Coffee For You", "color":"Blue","numcups":4,"price":50.00}{"img":"img/coffee9.png","coffeemakerID":"99","name":"XPress","brand":"Shiny Appliances", "color":"Green","numcups":1,"price":95.00} 3. 使用相同的实例指定信息,指定一个 REST GET 请求,以获得数据库中的咖啡机列表:• HTTP 操作: GET• URL: http://server:port/rest/coffeemakerapp/coffeemakers• 您的实例的登录凭证。 该调用返回一个咖啡机列表,如: [{"img":"img/coffee3.png","coffeemakerID":"1","name":"Double Dip","brand":"Coffee+", "color":"Blue","numcups":2,"price":71.73},{"img":"img/coffee4.png","coffeemakerID":"2","name":"French Press","brand":"Coffee For You", "color":"Blue","numcups":4,"price":50},{"img":"img/coffee9.png","coffeemakerID":"3","name":"XPress","brand":"shiny Appliances", "color":"Green","numcups":1,"price":95}] 4. 指定以下 REST 调用,删除 ID=2 的咖啡机:• HTTP 操作:DELETE• URL: http://server:port/rest/coffeemakerapp/coffeemaker/2• 您的实例的登录凭证。 为自己定义 REST 接口 该调用返回成功状态: {"Status":"OK"} 5. 重复 REST GET 请求。该调用返回一个咖啡机列表,如: [{"img":"img/coffee3.png","coffeemakerID":"1","name":"Double Dip","brand":"Coffee+", "color":"Blue","numcups":2,"price":71.73},{"img":"img/coffee9.png","coffeemakerID":"3","name":"XPress","brand":"Shiny Appliances", "color":"Green","numcups":1,"price":95}] 5.7 记录 REST 接口 当您向开发者提供 REST 接口时,您应该提供文档,以便他们知道如何调用接口。您可以使用 Open API Spec 来记录 REST 接口,并使用工具,如 Swagger 来编辑和格式化文档。InterSystems 正在开发一项功能来支持这个文档。这个版本包含了 API 管理(API Management)中的一个功能,它可以为您的 REST API 生成文档框架。您仍然需要编辑生成的文档,以添加注释和额外的信息,例如参数和 HTTP 返回值的内容。要为 CoffeeMakerApp REST 示例生成文档,请输入以下 REST 调用,使用您的 InterSystems IRIS 实例的指定信息和您创建的命名空间的名称:• HTTP 操作:GET• URL: http://server:port/api/mgmnt/v1/namespace/spec/rest/coffeemakerapp/• 您的 InterSystems IRIS 实例的登录凭证。 您可以把这个调用的输出粘贴到 swagger 编辑器中。它将 JSON 转换为 YAML(另一种标记语言(Yet Another Markup Language))并显示文档。您可以使用 swagger 编辑器向文档中添加更多信息。Swagger 编辑器显示的文档如下所示: 有关 InterSystems IRIS 和 REST 的更多信息 6 有关 InterSystems IRIS 和 REST 的更多信息 有关在 InterSystems IRIS 中创建 REST 服务的更多信息,请参见以下内容:• Setting Up RESTful Services(设置 RESTful 服务) 是 InterSystems 的在线课程,它使用与本文档相同的咖啡机应用程序,但更详细。 您需要登录 learning.intersystems.com 才能参加这个课程。如果您没有账户,可以创建一个。• Creating REST Services(《创建 REST 服务》)• Using REST Services and Operations in Productions(《在产品中使用 REST 服务和操作》)
文章
jieliang liu · 十月 26, 2021

IRIS 2021 技术文档 First Look 29 技术概要:LDAP 和 InterSystems 产品

技术概要:LDAP 和 InterSystems 产品 目录 技术概要: LDAP 和 InterSystems 产品 1 设置 LDAP 身份验证 1 选择 InterSystems IRIS 实例 1 定义 LDAP 配置 1 选择新的 LDAP 域作为默认值 2 启用 LDAP 身份验证 2 为 LDAP 服务器安装安全证书 3 探索 LDAP 用户和组 4 User1: 操作员 4 User2: 管理者 5 User3: 开发者 5 自动创建用户 6 了解有关 LDAP 和安全的更多信息 6 技术概要:LDAP 和 InterSystems 产品 InterSystems IRIS®数据平台可以与 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)服务器集成,从而可以无缝地使用这种流行技术对用户进行身份验证。通过 LDAP 提供授权也很容易。 当用户尝试登录 InterSystems IRIS 时,用户名和密码会被发送到 LDAP 服务器,以验证该用户是否存在。一旦用户的身份得到验证,LDAP 服务器就会向 InterSystems IRIS 发送关于用户属于哪些组的信息。这些组与 InterSystems IRIS 中的角色相对应,这些角色控制用户被授权执行什么操作,以及是否可以读取或写入内容。通过这种方式,InterSystems IRIS 在其安全策略的身份验证和授权方面都使用了 LDAP 技术。 按照本指南中的步骤,您可以连接到 LDAP 服务器,并探索它如何影响 InterSystems IRIS 中的安全。在这些练习中,您将配置 InterSystems IRIS 以与 Windows 活动目录(Active Directory)服务器集成。虽然也支持其他的 LDAP 服务器,但本文主要介绍如何使用活动目录(Active Directory)进行 LDAP 身份验证和授权。 要浏览所有的技术概要(First Look),包括下面描述的可以在免费的社区版(Community Edition)实例上执行的其他内容,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 设置 LDAP 身份验证 在以 LDAP 用户登录并在 InterSystems IRIS 中探索基于 LDAP 的安全之前,需要完成以下操作: 选择 InterSystems IRIS 实例 定义 LDAP 配置 选择 LDAP 域作为默认值 在 InterSystems IRIS 中启用 LDAP 身份验证 为 LDAP 服务器安装安全证书 选择 InterSystems IRIS 实例 要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您的选择包括多种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。 定义 LDAP 配置 InterSystems IRIS 使用 LDAP 配置来定义连接到 LDAP 服务器和搜索用户所需的信息。要创建和定义新的 LDAP 配置: 设置 LDAP 身份验证 在浏览器中打开您的实例的管理门户(Management Portal)。要使用的 URL 取决于您选择的实例类型;有关确定正确的 URL 的信息,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)。 进入 Security LDAP Configurations(安全 LDAP 配置) 页面 (System Administration(系统管理) > Security(安全) > System Security(系统安全) > LDAP Configurations(LDAP 配置))。 点击 Create New LDAP configuration(创建新 LDAP 配置)。 在 Name(名称)字段中,输入 irisldap.com。 选择 Enabled(已启用) 复选框。 选择 LDAP server is a Windows Active Directory server(LDAP 服务器是一个 Windows 活动目录(Active Directory) 服务器) 复选框。 定义以下字段: +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | 字段 | > 内容 | +=================================================================+===========================================================================+ | LDAP domain name(LDAP 域名) (仅限 Windows) | > irisldap.intersystems.com | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | LDAP host names(LDAP 主机名) | > irisldapdc1.irisldap.intersystems.com | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | LDAP username to use for searches(用于搜索的 LDAP 用户名) | - (Windows) sidLDAPQuery | | | | | | - (UNIX®) | | | | | | > CN=sidLDAPQuery,CN=Users,DC=irisldap,DC=intersystems,DC=com | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | LDAP username password(LDAP 用户名密码) | > 选择 Enter New Password(输入新密码), 然后输入密码为 Cach3L3arning | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | LDAP Base DN to use for searches(用于搜索的 LDAP 基础 DN) | > DC=irisldap,DC=intersystems,DC=com | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ | LDAP Unique search attribute(LDAP 独特的搜索属性) | > sAMAccountName | +-----------------------------------------------------------------+---------------------------------------------------------------------------+ 选择 Use TLS/SSL encryption for LDAP sessions(将 TLS/SSL 加密用于 LDAP 会话)复选框。 选择 Use LDAP Groups for Roles/Routine/Namespace(将 LDAP 组用于角色/路由/命名空间)复选框。 选择 Allow Universal group Authorization(允许通用组授权)复选框。 点击 Save(保存)。 选择新的 LDAP 域作为默认值 一旦定义了 LDAP 服务器的 LDAP 配置,您需要将新的 LDAP 配置设置为默认的 LDAP 域。要将 LDAP 服务器设置为默认服务器: 从管理门户(Management Portal)主页,进入 System-wide Security Parameters(全系统安全参数) 页面 (System Administration(系统管理) >**Security(安全) > System Security(系统安全) > System-wide Security Parameters(全系统安全参数)**)。 从 Default security domain(默认安全域)下拉列表中选择 irisldap.com。 点击 Save(保存)。 启用 LDAP 身份验证 使用 LDAP 服务器只是 InterSystems IRIS 中可用的一种身份验证方法。不仅必须为 InterSystems IRIS 的整个实例启用 LDAP 身份验证,而且需要由 LDAP 用户访问的 InterSystems IRIS 的每个组件也必须启用 LDAP 身份验证。以下程序为实例和 InterSystems IRIS 安全所需的那些组件启用 LDAP 身份验证: 设置 LDAP 身份验证 从管理门户(Management Portal)主页,进入 Authentication/Web Session Options(身份验证/Web 会话选项) 页面(System Administration(系统管理)> Security(安全) > System Security(系统安全) > Authentication/Web Session Options(身份验证/Web 会话选项))。 选择 Allow LDAP authentication(允许 LDAP 身份验证)复选框。 点击 Save(保存)。 从管理门户(Management Portal)主页,进入 Web Applications(Web 应用程序)页面 (System Administration(系统管理) > Security(安全) > Applications(应用程序) > Web Applications(Web 应用程序))。 在这个页面上,您将为您在 InterSystems IRIS 中将要访问的管理门户(Management Portal)部分启用 LDAP 授权。因为管理门户(Management Portal)的其他部分没有启用 LDAP 授权,如果您试图探索这些其他部分,可能会被要求登录。 点击 /csp/sys 来显示用于配置 web 应用程序的页面。 在 Security Settings(安全设置) 部分,在 Allowed Authentication Methods(允许的身份验证方法)字段中选择 LDAP 复选框。 点击 Save(保存)。 一旦设置被保存,点击 Cancel(取消)以返回到 Web Applications(Web 应用程序)页面。 点击 /csp/sys/sec。这个 web 应用程序包含管理门户(Management Portal)的安全页面。 在 Security Settings(安全设置)部分,在 Allowed Authentication Methods(允许的身份验证方法)字段中选择 LDAP 复选框。 点击 Save(保存)。 一旦设置被保存,点击 Cancel(取消)以返回到 Web Applications(Web 应用程序) 页面。 点击 /csp/sys/op。这个 web 应用程序包含管理门户(Management Portal)的操作页面。 <span id="1.5_Installing_a_Security_Certificate_fo" class="anchor"></span>在 Security Settings(安全设置) 部分,在 Allowed Authentication Methods(允许的身份验证方法)字段中选择 LDAP 复选框。 点击 Save(保存)。 为 LDAP 服务器安装安全证书 LDAP 服务器采用 TLS 进行安全保护,因此您需要安装安全证书才能成功访问服务器。在将其标识为安全证书之前,您将创建一个包含所需证书内容的 .cer 文件。 创建 .cer 文件 要创建将作为安全证书安装的文件: 打开一个文本编辑器,如记事本,并创建一个新文件。 复制以下所有内容并将其粘贴到文本编辑器中的新文件中。新文件应该以 -----BEGIN CERTIFICATE-----开头,并以-----END CERTIFICATE-----结尾。 -----BEGIN CERTIFICATE----- MIIDuTCCAqGgAwIBAgIQO5hG2uC7G7ZBxcXt/J+z3TANBgkqhkiG9w0BAQsFADBv MRMwEQYKCZImiZPyLGQBGRYDY29tMRwwGgYKCZImiZPyLGQBGRYMaW50ZXJzeXN0 ZW1zMRgwFgYKCZImiZPyLGQBGRYIaXJpc2xkYXAxIDAeBgNVBAMTF2lyaXNsZGFw LUlSSVNMREFQREMxLUNBMB4XDTE4MDQwOTE0MDUzMloXDTIzMDQwOTE0MTUzMlow bzETMBEGCgmSJomT8ixkARkWA2NvbTEcMBoGCgmSJomT8ixkARkWDGludGVyc3lz dGVtczEYMBYGCgmSJomT8ixkARkWCGlyaXNsZGFwMSAwHgYDVQQDExdpcmlzbGRh cC1JUklTTERBUERDMS1DQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AL/aNDJJNbzGh6tXG8+hmEEplb80UQMcIhLvoanz/RKKZXBBY68rO5pkYUwn/24g pryGy0OUjA997KKol5rdbXWzK7vUMuVSp0atw1m4vF9hmp1bpKBC60OXmV39Fqar ej1dkRl0ZXOmCexP8JqTyNwhpOLXvazzzvsNRr4ts9u1m6y9kFYecu4PRqtFCgoC T6rbgqz1Ew3VrhQHi0HWvq1sR2CngxdyG8AnlSo6nz3X/IrTwrw5lauNLfpsRda5 D5YfUpxYeqpONSUB650u9bC0l5eRWe8kS33Xr+u5Odkhy087I/zN+GK7xMGzxYMR OWNINIGRvlLuDRshKQl4gP0CAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB /wQFMAMBAf8wHQYDVR0OBBYEFM3Ofv4R/zkEgHkp4ayvTkAvxJikMBAGCSsGAQQB gjcVAQQDAgEAMA0GCSqGSIb3DQEBCwUAA4IBAQC8hhvc/+WsDeipNezBo+ovum2z 7q0fStr73Tj84cDGSyCmT2Q/h0qFvkfjtRd8AUBdG0qjhIB4VLVyWmrWDl1jAUcr 3AzygfO6UZjNRT+4c8r8R2xOhE3wJEJWibzXD9bPCtCkhYNJT6bi5PSRgUq+r9GU 探索 LDAP 用户和组 IHnAUmaQa+K+kNEpAvBfIeQ2ox9NPbtUfj/fswKpubWzZZc2udeU8SQLacl6tZMA tXgZPT6lQfoZU2WmDG1EnoC4Ji1++Sf6Ho2i6kxg1m6geyOPSsGPdsAVjYCqCjuZ pxjAsfZXV2juLyTBM51rrmV/Rqfougnikh4zhFRBrOHtMP71ZxCptMVz3RHe -----END CERTIFICATE----- 在您可以访问的目录中将该文件另存为 irisldap.cer。 在 Windows 上安装安全证书 如果您在 Windows 上运行 InterSystems IRIS,请完成以下步骤来完成安装您所创建的安全证书的过程。 使用 Windows 资源管理器(Explorer),双击在您保存文件的目录中的安全文件 irisldap.cer。 点击 Install Certificate(安装证书)。 选择 Local Machine(本地机器) 并点击 Next(下一步)。 点击 Yes(是) 以允许对您的设备进行更改。 选择 Place all certificates in the following store(将所有证书放入以下存储区)并点击 Browse(浏览)。 选择 Trusted Root Certification Authorities(受信任的根证书颁发机构)并点击 OK(确定)。 点击 Next(下一步)。 点击 Finish(完成)。 在 UNIX®上安装安全证书 如果您在 UNIX®上运行 InterSystems IRIS,请完成以下步骤来完成安装您所创建的安全证书的过程。 以 _system 用户身份登录管理门户(Management Portal)时,进入 Security LDAP Configurations(安全 LDAP 配置) 页面 (System Administration(系统管理) > Security(安全) > System Security(系统安全) > LDAP Configurations(LDAP 配置))。 从 LDAP 配置的列表中点击 irisldap.com。 在 TLS/SSL certificate file(TLS/SSL 证书文件)字段中,输入 irisldap.cer 的路径和文件名,这是您创建并保存的文件。 探索 LDAP 用户和组 现在您已经配置了您的 LDAP 连接并启用了 LDAP 身份验证,您可以使用 LDAP 服务器来登录 InterSystems IRIS。LDAP 服务器包含三个用户:user1、user2 和 user3。user1 属于 intersystems-Role-%Operator 组,user2 属于 intersystems-Role-%Manager 组,user3 属于 intersystems-Role-%Developer 组。每个组都授予属于 InterSystems IRIS 中相应角色的权限。例如,当 user1 通过 LDAP 服务器的身份验证成功时,将为其分配 %Operator 角色。 在本教程中,您将以所有三个用户的身份登录到 InterSystems IRIS,并根据与用户关联的角色探索可用的操作。当您作为一个有效的 LDAP 用户登录到 InterSystems IRIS 时,InterSystems IRIS 会自动创建用户,而不需要您事先手动添加用户。 User1: 操作员 要以 user1 的身份登录并探索 InterSystems IRIS: 如果您目前已登录到 InterSystems IRIS,请点击管理门户(Management Portal)左上角的 Logout(退出) 链接。 探索 LDAP 用户和组 使用以下凭证登录 InterSystems IRIS: 用户名:user1 密码:Password1 user1 是 intersystems-Role-%Operator 组的成员。基于这个组,当 user1 通过身份验证时,他们会被自动授予与 InterSystems IRIS 中 %Operator 角色相关的权限。 从管理门户(Management Portal)主页,进入 Databases(数据库) 页面 (System Operation(系统操作) > Databases(数据库))。user1 可以访问这个页面,因为他们已经被 LDAP 服务器授权,可以和与 %Operator 角色关联的页面进行交互。 在管理门户(Management Portal)主页上,请注意 System Administration(系统管理) 菜单已被禁用。 user1 不能访问此菜单,因为 %Operator 角色不包含适当的权限。 User2: 管理者 要以 user2 的身份登录并探索 InterSystems IRIS: 点击管理门户(Management Portal)左上角的 Logout(退出) 链接。 使用以下凭证登录 InterSystems IRIS: 用户名:user2 密码:Password2 user2 是 intersystems-Role-%Manager 组的成员。基于这个组,当 user2 通过身份验证时,他们会被自动授予与 %Manager 角色相关的权限。正如您将看到的,这些权限包括访问 user1 无法看到的页面。 从管理门户(Management Portal)主页,进入 Users(用户) 页面 (System Administration(系统管理) > Security(安全) > Users(用户))。请记住,user1 不能访问 System Administration(系统管理) 菜单。 从用户列表中点击 user1。 点击 Roles(角色) 标签。 请注意,%Operator 是分配给 user1 的唯一角色。 点击 Cancel(取消) 以返回到 Users(用户) 页面。 请注意,在用户列表中没有 user3 的条目。该用户将在 user3 登录时自动创建,此时 InterSystems IRIS 使用 LDAP 服务器对用户进行身份验证。 User3: 开发者 要以 user3 的身份登录并探索 InterSystems IRIS: 点击管理门户(Management Portal)左上角的 Logout(退出)链接。 使用以下凭证登录 InterSystems IRIS: 用户名:user3 密码:Password3 user3 是 intersystems-Role-%Developer 组的成员。基于这个组,当 user3 通过身份验证时,他们会被自动授予与 %Developer 角色相关的权限。 请注意,该用户可以访问 System Explorer(系统资源管理器)菜单,而不是 System Operation(系统操作)和 System Administration(系统管理)菜单。您可以看出,分配给 user3 的 %Developer 角色与分配给 了解有关 LDAP 和安全的更多信息 user1 和 user2 的角色具有不同的权限。这可以防止 user3 看到自己的用户配置文件,因为 Users(用户)页面是在 System Administration(系统管理)菜单下。 自动创建用户 您已经登录到 InterSystems IRIS,但没有先创建新用户。当在 LDAP 服务器上发现这些用户时,InterSystems IRIS 会自动创建这些用户。下面的程序演示了这个过程: 点击管理门户(Management Portal)左上角的 Logout(退出)链接。 使用以下凭证登录 InterSystems IRIS: 用户名:user2 密码:Password2 请记住,user2 拥有 %Manager 角色。 从管理门户(Management Portal)主页,进入 Users(用户) 页面 (System Administration(系统管理) > Security(安全) > Users(用户))。 在列表中找到 user3 并点击行中的 Delete(删除)。 此时,拥有 %Developer 角色的 user3 在 InterSystems IRIS 中不复存在。 点击管理门户(Management Portal)左上角的 Logout(退出)链接。 使用以下凭证登录 InterSystems IRIS: 用户名:user3 密码:Password3 因为 user3 仍然存在于 LDAP 服务器上,所以即使您刚刚在 InterSystems IRIS 中删除了用户帐户,您也能够以 user3 的身份重新登录到 InterSystems IRIS。 如果需要,您可以重新登录 InterSystems IRIS,以确认 user3 现在是一个用户。 a. 点击管理门户(Management Portal)左上角的 Logout(退出)链接。 b. 使用以下凭证登录 InterSystems IRIS: 用户名:user2 密码:Password2 c. 从管理门户(Management Portal)主页,进入 System Administration(系统管理) > Security(安全) > Users(用户)。user3 现在在列表中,尽管您之前删除了该用户账户。 了解有关 LDAP 和安全的更多信息 您可以使用以下参考资料来了解有关 LDAP 和其他安全概念的更多信息。 有关在 InterSystems IRIS 中使用 LDAP 的详细信息,请参见 LDAP Guide(《LDAP 指南》)。 有关 InterSystems IRIS 中基于角色的安全的介绍,请参见 First Look:Role-Based Access Control(《技术概要:基于角色的访问控制》)。