搜索​​​​

清除过滤器
公告
Claire Zheng · 十一月 30, 2022

荣誉!InterSystems被独立研究机构Forrester评为“事务分析型数据平台领导者”

2022 年 12 月 1 日,中国,北京——致力于帮助客户解决最关键的可扩展性、互操作性和速度问题的创新数据技术提供商 InterSystems 今天宣布,在Forrester日前公布的《The Forrester Wave™:事务分析型数据平台(2022年第4季度)》报告中,InterSystems IRIS® 数据平台被评为领导者。 Forrester 将事务分析型数据平台(Translytical data platform)定义为“构建在单一数据库引擎上来支持多种数据类型和数据模型的下一代数据平台,旨在支持事务、操作和分析工作负载,而不牺牲数据完整性、性能和分析规模”。 InterSystems 认为实时(real-time)功能对事务分析型平台至关重要,是智能数据编织(smart data farics)的一个关键组成部分。这种方法基于数据和实时分析,为业务线用户提供洞察,使组织能够更快地管理中断(manage disruption),并在充满不确定和竞争日益激烈的环境中发现新的机会。 在评估过程中,Forrester 根据三个类别的标准对供应商进行了评分:当前产品、战略和市场占有率。InterSystems 在以下这些标准中均获得了最高分:建模/工具;可延展性(扩展平台的功能);可扩展性;产品愿景(与客户当前和未来需求一致);执行路线图;公司业绩以及工程师数量。 InterSystems IRIS® 数据平台 使企业能够快速开发、部署和执行数据密集型分析应用程序。通过让构建高性能、支持机器学习的应用程序变得更容易(这些应用程序可以连接数据和应用孤岛),InterSystems IRIS 简化了架构,赋能关键任务应用程序——当今企业需要这些应用程序快速解决棘手的业务难题。 InterSystems 数据平台副总裁 Scott Gnau 表示:“我们知道,在一个竞争更激烈、更动荡的世界中,企业需要更快地获得洞察以改进决策。InterSystems为客户提供了一些全新视角,这些视角只能来自于对所有相关数据的深入分析。” 通过创建智能数据编织(smart data fabric)架构,InterSystems IRIS 使企业能够做出更智能的决策,实现更好的结果。目前,一家管理着超过1万亿美元资产的全球投资银行正在使用 InterSystems IRIS 为其实时多资产交易平台提供动力,与之前的实施相比,InterSystems IRIS 令平台的可靠性、可扩展性和成本效益都得到了提升。得益于 InterSystems IRIS,银行表现提高了 10 倍,运营成本降低了 75%,吞吐量增加了 5 倍。 InterSystems IRIS 拥有如 InterSystems IRIS 自适应分析(可实现业务用户的自助服务)、IntegratedML(可用于公众数据科学),以及在编程工作流中执行实时分析的极端性能等优秀功能。InterSystems IRIS 部署在全球各地,可在多个公共云市场上使用,包括 Amazon Web Services、Microsoft Azure 和谷歌云平台。 点击“这里”,下载《The Forrester Wave™:事务分析型数据平台(2022年第4季度)》。
文章
TZ Zhuang · 八月 6, 2021

FAQ 常见问题系列--系统管理篇 如何使用命令在Journal日志文件中搜索指定的Global

可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。 下面是这两个查询的具体作用: A) %SYS.Journal.File类中的ByTimeReverseOrder查询这个查询会获取journal日志文件名并按降序排列 USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder") USER>do rs.Execute() USER>while rs.Next() { write rs.Name,! } c:\intersystems\cache\mgr\journal\20190620.003 c:\intersystems\cache\mgr\journal\20190620.002 c:\intersystems\cache\mgr\journal\20190620.001 c:\intersystems\cache\mgr\journal\20190610.001 B) %SYS.Journal.Record类中的List查询这个查询可以从指定journal日志文件中获取日志记录 USER>set rs2=##class(%ResultSet).%New("%SYS.Journal.Record:List") USER>do rs2.Execute("c:\intersystems\cache\mgr\journal\20190620.003") USER>while rs2.Next() { if rs2.Get("GlobalReference")["TEST" write rs2.Get("GlobalReference"),!} ^["^^c:\intersystems\cache\mgr\user\"]TEST(1) ...... ^["^^c:\intersystems\cache\mgr\user\"]TEST(9) ^["^^c:\intersystems\cache\mgr\user\"]TEST(10) 这里我们可以把从A查询获得的结果传到B查询里。如果想了解从B查询里还能获得哪些字段的内容,请参考文档里的%SYS.Journal.Record类定义 下面是一个把A和B查询合并在一起的例子: ///参数 globalname: 需要查询的Global名字(不包括^) ClassMethod SearchAllJournals(globalname As %String) { if $get(globalname)="" { write "请指定Global名字",! quit } //从当前所有journal日志文件中搜索指定的global set rs1=##class(%ResultSet).%New() set rs1.ClassName="%SYS.Journal.File" set rs1.QueryName="ByTimeReverseOrder" do rs1.%Execute() while rs1.%Next() { set jrnfile=rs1.%Get("Name") set size=rs1.%Get("Size") write "Journal file:",jrnfile,!," File size:",size/1024/1024," MB",! do ..SearchGlobal(globalname,jrnfile) } do rs1.Close() } ///第一个参数 globalname: 需要查询的Global名字(不包括^) ///第二个参数 jrnfile: 指定的journal日志文件名字(包括路径) ClassMethod SearchGlobal(globalname As %String, jrnfile As %String) { set rs1=##class(%ResultSet).%New() set rs1.ClassName="%SYS.Journal.Record" set rs1.QueryName="List" //打开journal日志文件并搜索指定的Global do rs1.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",globalname)) while rs1.%Next() { set glo=rs1.%Get("GlobalReference") write " ",glo," = ",rs1.%Get("NewValue"),! } do rs1.Close() }
公告
Claire Zheng · 八月 22, 2022

InterSystems IRIS医疗版互联互通套件2.0版支持国内互联互通标准转换为FHIR标准,提升数据易用性

2022年8月22日,中国 北京 —— 致力于帮助客户解决最关键的可扩展性、互操作性和速度问题的创新数据技术提供商InterSystems今日宣布在中国推出InterSystems IRIS医疗版互联互通套件2.0版,更好地满足用户对数据利用的需求。医疗技术的进步带来了呈指数级增长的数据量,医疗数据变得更分散、异构性更强、数据量更大,互操作性变得比以往任何时候都更加重要,更具挑战性。在国内,中国医院信息互联互通标准化成熟度测评工作自启动以来,已成为医院数据实现互联互通的重要建设标准。在国际上,HL7 FHIR®(快速医疗互操作性资源)缩小了医疗数据爆炸与数据应用能力之间的差距,成为面向未来的医疗数据互操作的标准。近年来,FHIR引起国内业内人士越来越多的关注与认可。此次推出的InterSystems IRIS医疗版互联互通套件2.0版本打通了国际、国内互联互通生态,有助于推动医疗数据的有效利用。 作为医疗行业数据技术和基于标准的互操作性的领导者,InterSystems长期致力于基于FHIR提供解决方案以解决医疗行业面临的挑战。2021年,InterSystems中国结合国内新版测评标准推出InterSystems IRIS医疗版互联互通套件,满足了医院快速落地互联互通标准化成熟度测评涉及到的标准化改造需求,广受市场认可。点击此处了解“InterSystems IRIS医疗版互联互通套件”详情。 InterSystems最新推出的InterSystems IRIS医疗版互联互通套件2.0版在原有服务基础上,打通了国内互联互通生态与FHIR生态,支持互联互通文档转换为FHIR资源,这一创新举措有效填补了市场空白。通过转换,满足FHIR标准的医疗数据能够在多种业务场景下更易获取和应用。InterSystems IRIS医疗版互联互通套件2.0版解决了长期以来大量医疗数据无法得到有效利用的难题,有利于提升医疗数据的利用价值,助力医疗机构持续实现业务创新。对用户而言,基于InterSystems IRIS医疗版数据平台,即可一键部署FHIR资源仓库,并基于FHIR API和资源开发临床、科研和健康管理等新应用。 此外,InterSystems IRIS医疗版互联互通套件2.0版可为用户提供一套完整的API,实现对互联互通平台的监控和管理,提升用户的业务管理能力。 InterSystems技术兼备高性能与稳定性,在国内连续多年支持数百家大型公立医院海量数据稳定运行。主流PC服务器单实例下,支持日消息吞吐量可高达27.64亿。截至2021年,InterSystems技术已助力一百余家医院通过四级及以上医院信息互联互通标准化成熟度评级,其中,五乙用户占全国30%以上。 InterSystems 亚太区总经理卢侠亮表示:“FHIR能够实时访问分布在各系统、数据库和设备上的数据,因此被行业称为面向未来的医疗数据标准,对于希望有效利用数据价值的用户来说,FHIR是不容错过的。InterSystems多年来始终致力于FHIR建设,我相信InterSystems IRIS医疗版互联互通套件2.0将为中国用户带来更高效的标准化互联互通技术保障。” 2022年8月19日,“InterSystems IRIS医疗版互联互通套件2.0”线上发布会成功举办,会议包括“产品演示”与“互动答疑”两个环节,欢迎点击此处观看发布会回放,了解更多详情。 如果您希望了解更多相关内容,欢迎跟帖回复!
问题
Yufeng Li · 四月 19, 2021

Nginx 怎么配置成IRIS web服务器

现在有windows上的 编译好的nginx 可以做为iris 的web 服务器吗? ngx_http_csp_module_sa.c , cspapi.h 这两个文件在哪下载? 请从Nginx官网:nginx.org 下载,InterSystems不提供nginx 下载。 文中提到的文件可以在InterSystems IRIS 安装目录的 \dev\csp\nginx 文件夹下找到。
公告
jieliang liu · 四月 18, 2022

新视频!SQL性能--极品飞车!

各位开发者们好, 欢迎在我们的 Bilibili 频道观看新视频: 客户选择InterSystems IRIS的原因是其强大的数据引擎的纯粹速度。为了衡量我们的引擎改进对速度的贡献,我们不断地进行性能测试,包括内部测试和使用客户的数据和工作负载的测试。在过去的一年里,这些测试表明基于SQL的应用程序的性能有了很大的提高,我们将很高兴在这个视频中告诉你更多。 收获: InterSystems IRIS提供的SQL性能会让你大吃一惊。 演讲者: @Benjamin.DeBoe, InterSystems 产品经理 本视频的其他材料,你可以在 InterSystems Online Learning Course找到。 请继续关注! 👍🏼
公告
Claire Zheng · 一月 17, 2022

了解如何使用IRIS医疗版构建您的首款FHIR应用!

为了帮助您开始使用FHIR,我们发布了一个新的学习路径: Building Basic FHIR Integrations with InterSystems IRIS for Health. 通过这个路径,您可以学习FHIR的基础知识,学习如何在InterSystems IRIS医疗版中设置FHIR端点,将数据应用到FHIR存储库并转换FHIR数据,使用InterSystems API管理器管理FHIR API,以及使用客户端应用查询FHIR资源。该路径包括一些建议,例如使用SDA-FHIR转换将其他数据格式转换为FHIR。 我们还在考虑如何创建额外的内容,以指导您启用现有的应用程序并利用存储在FHIR存储库之外的数据。这些对您有用吗?关于如何使用FHIR和InterSystems产品,您还想学习什么?
文章
Michael Lei · 六月 1, 2022

部分IRIS 2022 年度编程大奖赛作品展示—— 利用IRIS 一体化机器学习IntegratedML来预测糖尿病的Web 应用

糖尿病可以从医学界熟知的一些参数中发现。这样,为了帮助医学界和计算机软件系统,特别是人工智能软件,美国国家糖尿病和消化道及肾脏疾病研究所发布了一个非常有用的数据集,用于训练糖尿病检测/预测的机器学习算法。这份出版物可以在最大和最知名的ML数据库Kaggle上找到,网址是https://www.kaggle.com/datasets/mathchi/diabetes-data-set。 该糖尿病数据集有以下元数据信息(来源:https://www.kaggle.com/datasets/mathchi/diabetes-data-set): 怀孕:怀孕次数 葡萄糖: 口服葡萄糖耐量试验中2小时的血浆葡萄糖浓度 Plasma glucose concentration a 2 hours in an oral glucose tolerance test 血压: 舒张压(mm Hg) 皮肤厚度: 肱三头肌皮褶厚度(mm) 胰岛素: 2小时血清胰岛素(mu U/ml) BMI: 体重指数 (体重 kg/(身高 m)^2) 糖尿病血统函数: 糖尿病血统函数(它提供了一些关于亲属中的糖尿病史以及这些亲属与病人的遗传关系的数据。这种对遗传影响的测量使我们了解到一个人可能有的遗传风险与糖尿病的发病有关--来源:https://machinelearningmastery.com/case-study-predicting-the-onset-of-diabetes-within-five-years-part-1-of-3/) 年龄: 结果: 类变量 (0 or 1) 实例数量: 768 属性数量: 8 + 1个类变量 对每个属性: (全部为numeric数字量化类型) 怀孕次数 口服葡萄糖耐量试验中2小时的血浆葡萄糖浓度 舒张压 (mm Hg) 三头肌皮褶厚度 (mm) 2小时血清胰岛素 (mu U/ml) BMI指数 (体重 kg/(身高 m)^2) 糖尿病血统函数 年龄 类变量 (0 or 1) 缺失属性值: 是 类分布: (类值为1解释为 "糖尿病测试阳性") 从Kaggle获取糖尿病数据 Kaggle的糖尿病数据可以通过Health-Dataset程序加载到IRIS表中:https://openexchange.intersystems.com/package/Health-Dataset。要做到这一点,在你的module.xml项目中,设置依赖关系(Health Dataset的ModuleReference)。 Module.xml with Health Dataset application reference <?xml version="1.0" encoding="UTF-8"?> <Export generator="Cache" version="25"> <Document name="predict-diseases.ZPM"> <Module> <Name>predict-diseases</Name> <Version>1.0.0</Version> <Packaging>module</Packaging> <SourcesRoot>src/iris</SourcesRoot> <Resource Name="dc.predict.disease.PKG"/> <Dependencies> <ModuleReference> <Name>swagger-ui</Name> <Version>1.*.*</Version> </ModuleReference> <ModuleReference> <Name>dataset-health</Name> <Version>*</Version> </ModuleReference> </Dependencies> <CSPApplication Url="/predict-diseases" DispatchClass="dc.predict.disease.PredictDiseaseRESTApp" MatchRoles=":{$dbrole}" PasswordAuthEnabled="1" UnauthenticatedEnabled="1" Recurse="1" UseCookies="2" CookiePath="/predict-diseases" /> <CSPApplication CookiePath="/disease-predictor/" DefaultTimeout="900" SourcePath="/src/csp" DeployPath="${cspdir}/csp/${namespace}/" MatchRoles=":{$dbrole}" PasswordAuthEnabled="0" Recurse="1" ServeFiles="1" ServeFilesTimeout="3600" UnauthenticatedEnabled="1" Url="/disease-predictor" UseSessionCookie="2" /> </Module> </Document> </Export> 预测糖尿病的前端和后端应用程序 访问 Open Exchange 应用连接 (https://openexchange.intersystems.com/package/Disease-Predictor) 并遵守以下步骤: Clone/git 把repo pull 到任何本地目录 $ git clone https://github.com/yurimarx/predict-diseases.git 打开 该目录下Docker终端并执行: $ docker-compose build 执行IRIS container: $ docker-compose up -d 在管理门户中执行查询来训练AI模型: http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen?$NAMESPACE=USER 创建用来训练的 VIEW : CREATE VIEW DiabetesTrain AS SELECT Outcome, age, bloodpressure, bmi, diabetespedigree, glucose, insulin, pregnancies, skinthickness FROM dc_data_health.Diabetes 利用View视图来创建 AI 模型: CREATE MODEL DiabetesModel PREDICTING (Outcome) FROM DiabetesTrain 训练模型: TRAIN MODEL DiabetesModel 访问 http://localhost:52773/disease-predictor/index.html 来使用疾病预测器qian frontend and predict diseases like this: 幕后工作 后端预测糖尿病的类方法 InterSystems IRIS 支持执行Select 并使用上一个创建的模型来预测。 Backend ClassMethod to predict Diabetes /// Predict Diabetes ClassMethod PredictDiabetes() As %Status { Try { Set data = {}.%FromJSON(%request.Content) Set qry = "SELECT PREDICT(DiabetesModel) As PredictedDiabetes, " _"age, bloodpressure, bmi, diabetespedigree, glucose, insulin, " _"pregnancies, skinthickness " _"FROM (SELECT "_data.age_" AS age, " _data.bloodpressure_" As bloodpressure, " _data.bmi_" AS bmi, " _data.diabetespedigree_" AS diabetespedigree, " _data.glucose_" As glucose, " _data.insulin_" AS insulin, " _data.pregnancies_" As pregnancies, " _data.skinthickness_" AS skinthickness)" Set tStatement = ##class(%SQL.Statement).%New() Set qStatus = tStatement.%Prepare(qry) If qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT} Set rset = tStatement.%Execute() Do rset.%Next() Set Response = {} Set Response.PredictedDiabetes = rset.PredictedDiabetes Set Response.age = rset.age Set Response.bloodpressure = rset.bloodpressure Set Response.bmi = rset.bmi Set Response.diabetespedigree = rset.diabetespedigree Set Response.glucose = rset.glucose Set Response.insulin = rset.insulin Set Response.pregnancies = rset.pregnancies Set Response.skinthickness = rset.skinthickness Set %response.Status = 200 Set %response.Headers("Access-Control-Allow-Origin")="*" Write Response.%ToJSON() Return 1 } Catch err { write !, "Error name: ", ?20, err.Name, !, "Error code: ", ?20, err.Code, !, "Error location: ", ?20, err.Location, !, "Additional data: ", ?20, err.Data, ! Return 0 } } 现在,任何网络应用都可以使用预测并显示预测结果。欢迎在frontend 文件夹查看本应用的源代码。
文章
he hf · 四月 24, 2023

SqlDbx连接IRIS攻略new

SqlDbx是我们常用的数据库查询与操作工具,因其轻量且无须安装而无处不在,然而习惯了在Intersystems的CACHE和ENSEMBLE版本下使用SqlDbx在升级到IRIS版本后却无法使用了,为此进行了一系列尝试,并最终获得成功,形成本文攻略,分享给大家。 1、在SqlDbx的连接登录窗口,从DBMS Type中直接选择 “InterSystems CACHE”连接IRIS会报错,提示“通过IRISconnect失败”,说明“InterSystems CACHE”不再适用于IRIS。 2、考虑IRIS的ODBC支持,为此换一种思路,采用ODBC方式连接,此方式需要在ODBC中建立DSN。 3、从Intersystems官网https://intersystems-community.github.io/iris-driver-distribution/或github网站https://github.com/intersystems-community/iris-driver-distribution/tree/...下载InterSystems IRIS ODBC 32位驱动,注意一定要下载32位驱动(注:SqlDbx现只支持32位的ODBC)。 4、下载后直接安装即可。 5、通过Windows的控制面板找到“管理工具”,打开后找到“ODBC Data Sources (32-bit)”(注:SqlDbx现只支持32位的ODBC),在弹出的“ODBC数据源管理程序(32位)”窗口中“用户DSN”页签中选择添加DSN,在随后弹出的“数据源驱动程序”窗口中选择“InterSystems IRIS ODBC35”,点击“完成”。 6、在弹出的“InterSystems ODBC Data Source Setup”窗口中填写数据源名称、描述、主机IP、端口、命名空间、用户名、密码,检查正确无误后、点击测试连接,在弹出的窗口中科室看到连接成功结果,点击“OK”,这就基本成功啦。 7、回到“ODBC数据源管理程序(32位)”窗口,可以看到刚才成功添加的用户DSN。 8、再回到SqlDbx的连接登录窗口,从DBMS Type中选择“OBDC”,点击DSN下拉选择框的后面三个点,在弹出的选择窗口中可以看到刚才成功添加的用户DSN,选中并点击OK,DSN中出现了刚才选择的数据库服务器,点击OK,成功完成了连接登录。恭喜你,可以用SqlDbx继续对IRIS的访问和操作啦!
公告
Nicky Zhu · 三月 30, 2021

提醒:镜像Dejournaling的潜在数据完整性问题

2021年3月23日 – 提醒:镜像Dejournaling的潜在数据完整性问 InterSystems 已经纠正了一个缺陷,该缺陷在极少数情况下会导致非主镜像成员的数据不一致问题。此缺陷影响到InterSystems产品的所有发布版本。 如果发生该缺陷,则会在镜像系统的正常运行中悄然发生。该缺陷的结果是,镜像成员未能删除数据库日志的子集,然后导致镜像成员之间的数据不一致。这对故障转移和异步成员都有影响。虽然这个缺陷遇到的可能性非常小,但InterSystems建议所有使用镜像的客户都要获得修正,并使用DataCheck验证镜像数据库的一致性。有关可能触发该缺陷的具体情况以及将遇到该缺陷的风险降至最低的步骤的更多详细信息,请联系全球响应中心(WRC)。 该缺陷的更正被确定为 SML2898、HYY2434 和 HYY2435,并将包含在所有未来的产品版本中,包括 Caché 和 Ensemble 2018.1.5 以及 InterSystems IRIS 和 InterSystems IRIS for Health 2019.1.2 和 2020.1.1。这些更正也可通过InterSystems全球响应中心(WRC)的Ad hoc分发版本获得。 如果您对这个提醒有任何疑问,请联系 Worldwide Response Center。
文章
Qiao Peng · 四月 15, 2021

数据平台焦点会议第 3 天的亮点

圆满结束! 所有的专题会议都已经播出了。当然,我们全部102部预录制的专题会议现在可以点播了,您可以随意观看,即使您错过了现场问答的机会。 说到现场问答,我们已经举办了6次现场会议,您也可以观看。我之前写过一篇单独的博客文章,题目是如何让您的问题会帮助我们做得更好。 智能工厂启动包 今天备受关注的亮点之一是Intersystems IRIS智能工厂启动包在OpenExchange上发布。为此,我们的合作伙伴ITVisors和他们的客户Vlisco与我们的Joe Lichtenberg一起举办了一场精彩的会议“MFG001:介绍适用于制造业的InterSystems IRIS智能工厂启动包”。 容器和Kubernetes平台 今天我们宣布了一个高度安全的新版IRIS容器,名为“iris-lockeddown”,这个容器非常适合在Kubernetes中使用加固型pod安全策略的团队。说到Kubernetes,Steve Lubars演示了我们新的InterSystems Kubernetes Operator,它让您可以很轻松地在Kubernetes 中部署IRIS集群。而Luca Ravazzolo则演示了如何用CPF合并文件配置您的IRIS实例,特别是如何自动化进行镜像配置。还有其他一些有趣的问题。 以上精彩内容尽在对话Ontario Systems公司企业架构师Jim Howell中,讲述了他们从庞大的旧系统迁移到Kubernetes现代化微服务架构的经历。 更多分析: 如果您觉得我们在分析领域没什么可谈论和宣布的了,再想想!Sergey在“DA014平台内AI的最佳实践”中分享了我们对平台内AI的观点,以及如何通过IRIS协调机器学习操作从而实现持续集成和交付(CI & CD)。作为“分析”板块的压轴,Benjamin展示了我们采用Alteryx的新协作项目,其允许业务分析师和主题专家不需要编程就可以构建分析工作流,并且可以轻松地将他们的工作融合到IRIS中。观看“DA011使用Alteryx搭配IRIS打造您的分析工作流”,了解更多关于这项合作的详情。 更多VS Code - ObjectScript https://intersystems.6connex.com/event/virtual-summit/en-us/contents/434914/share?rid=FocusSessions&nid=851040 我在第1天的博客中谈过这个,今天我们再次更深入地探讨了最热门的话题之一:源代码控制,观看“DEE006使用Visual Studio Code进行ObjectScript开发:选择IDE/源代码控制组合”和“DEE005使用Visual Studio Code进行ObjectScript开发:服务器端源代码控制”。我还注意到人们深入探讨了实战实验室并给与了高度评价——值得一试! 让我感到特别兴奋的是,我们在保持这一社区作为真正的开源社区的同时,还能提供大量InterSystems核心开发周期和InterSystems的深度支持。请加入社区并将您的建议反馈给我们! 是的,更多关于FHIR的内容 我们的FHIR板块一直很棒,第3天也不例外。 Russ Leftwich展示了一部很棒的动画,这部动画描绘了FHIR从起源到如今的整个发展历程,其中包括了所有最新的InterSystems FHIR技术。“FH008 FHIR:为未来设计的医疗数据标准”20分钟的总结,是我见过的最棒的关于FHIR的总结。 Kurt Dawn介绍了InterSystems客户非常关注的热门话题FHIR Profiles。他展示了如何将用于实现规范的FHIR包轻松导入IRIS医疗版。Jeff Morgan的IRIS医疗版中的FHIR实现模式演示了如何使用带生产和定制逻辑的FHIR服务器——高级开发者肯定想了解一下。 持续学习 还有很多其他的会议我没有提到;我建议大家去会议网站搜索自己感兴趣的话题——您可以看到所有板块的专题会议,演示区的各种演示,以及资源区的各种内容。 如果您先想看看亮点,然后再选择观看其他内容,您可以查看我的第1天和第2天总结,我们的紧密合作伙伴J2也一直在发布每日精彩回顾(查看J2第1天专题会议的精彩回顾和第2天专题会议的精彩回顾) 请教专家是深入了解任何您感兴趣的主题的好方法。现在预约10月30日或11月2日与专家或培训师会面也不迟!而且下周是实验室周——可以尝试实战实验室!您可以选择Office Hours以及On-Demand和Live Labs。 感谢参与我们的首次线上峰会! 您可以在下面评论或通过任何您喜欢的方式告诉我们您的想法。 查看原帖 由 @Jeff Fried 撰写
文章
Claire Zheng · 一月 13, 2023

【GS22 视频】医疗IT行业趋势观察与解读

在InterSystems 2022年全球峰会上,InterSystems HealthShare 产品管理总监 Jonathan Teich 及其团队解读了医疗与医疗IT行业的趋势,并分享了HealthShare的最新产品策略与路线图,演示了一些易用且具有前瞻性的功能和用例。
文章
Qiao Peng · 一月 14, 2021

Dockerfile 和它的朋友们或者如何在 InterSystems IRIS 上运行和合作 ObjectScript 项目

你好,开发者! 你们中的许多人在 [Open Exchange](https://openexchange.intersystems.com/) 和 Github 上发布了 InterSystems ObjectScript 库。 但对于开发者来说,如何简化项目的使用和协作呢? 在本文中,我想介绍一种简单方法,只需将一组标准文件复制到你的仓库中,就可以启动任何 ObjectScript 项目和对其做出贡献。 我们开始吧! **TLDR** - 将以下文件从[该仓库](https://github.com/intersystems-community/objectscript-docker-template)复制到你的仓库: [Dockerfile](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Dockerfile) [docker-compose.yml](https://github.com/intersystems-community/objectscript-docker-template/blob/master/docker-compose.yml) [Installer.cls](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Installer.cls) [iris.script](https://github.com/intersystems-community/objectscript-docker-template/blob/master/iris.script) [settings.json](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.vscode/settings.json "settings.json"){#9f423fcac90bf80939d78b509e9c2dd2-d165a4a3719c56158cd42a4899e791c99338ce73} [.dockerignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.dockerignore ".dockerignore"){#f7c5b4068637e2def526f9bbc7200c4e-c292b730421792d809e51f096c25eb859f53b637} [.gitattributes](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitattributes ".gitattributes"){#fc723d30b02a4cca7a534518111c1a66-051218936162e5338d54836895e0b651e57973e1} [.gitignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitignore ".gitignore"){#a084b794bc0759e7a6b77810e01874f2-e6aff5167df2097c253736b40468e7b21e577eeb} 你已经知道启动你的项目和协作的标准方式。 以下将详细说明这样做的步骤和原因。 **注意:**在本文中,我们将考虑可在 InterSystems IRIS 2019.1 及更新版本上运行的项目。 **选择 InterSystems IRIS 项目的启动环境** 通常,我们希望开发者尝试项目/库,并确保这是快速安全的练习。 在我看来,快速安全地启动任何新项目的理想方式是 Docker 容器,它可以保证开发者启动、导入、编译和计算任何内容对于主机来说都是安全的,并且不会破坏任何系统或代码。如果出了问题,只需停止并删除容器即可。 如果应用程序占用大量磁盘空间,使用容器将其擦除,空间就回来了。 如果某个应用程序破坏了数据库配置,只需删除配置被破坏的容器。 简单又安全。 Docker 容器提供安全和标准化。 运行通用 InterSystems IRIS Docker 容器的最简单方法是运行 [IRIS 社区版映像](https://hub.docker.com/_/intersystems-iris-data-platform/plans/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions): 1. 安装 [Docker desktop](https://www.docker.com/products/docker-desktop)  2. 在操作系统终端中运行以下命令: docker run --rm -p 52773:52773 --init --name my-iris store/intersystems/iris-community:2020.1.0.199.0 3. 然后在主机浏览器上打开管理门户: 4. 或者打开终端启动 IRIS: docker exec -it my-iris iris session IRIS 5. 不需要 IRIS 容器时,将其停止: docker stop my-iris 好! 我们在一个 docker 容器中运行 IRIS。 但是你希望开发者将你的代码安装到 IRIS 中,可能还要进行一些设置。 这就是我们下面要讨论的。 **导入 ObjectScript 文件** 最简单的 InterSystems ObjectScript 项目可以包含一组 ObjectScript 文件,例如类、例程、宏和global。 请查看有关命名和建议的文件夹结构的文章。 问题是如何将所有这些代码导入 IRIS 容器? 此时我们可以借助 Dockerfile 来获取通用 IRIS 容器,并将某个仓库中的所有代码导入 IRIS,然后根据需要对 IRIS 进行一些设置。 我们需要在仓库中添加一个 Dockerfile。 我们来看一下 [ObjectScript 模板](https://github.com/intersystems-community/objectscript-docker-template)仓库中的 [Dockerfile](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Dockerfile): ARG IMAGE=store/intersystems/irishealth:2019.3.0.308.0-community ARG IMAGE=store/intersystems/iris-community:2019.3.0.309.0 ARG IMAGE=store/intersystems/iris-community:2019.4.0.379.0 ARG IMAGE=store/intersystems/iris-community:2020.1.0.199.0 FROM $IMAGE USER root WORKDIR /opt/irisapp RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisapp USER irisowner COPY Installer.cls . COPY src src COPY iris.script /tmp/iris.script # run iris and initial  RUN iris start IRIS \     && iris session IRIS < /tmp/iris.script   前几个 ARG 行设置 $IMAGE 变量,随后在 FROM 中使用该变量。 这适合在不同的 IRIS 版本中测试/运行代码,只需在 FROM 前面的最后一行中更改 $IMAGE 变量即可切换版本。 这里我们采用: ARG IMAGE=store/intersystems/iris-community:2020.1.0.199.0 FROM $IMAGE 这意味着我们将使用 IRIS 2020 社区版 build 199。 我们想要导入仓库中的代码,这意味着我们需要将仓库中的文件复制到 docker 容器。 下面几行完成此操作: USER root WORKDIR /opt/irisapp RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisapp USER irisowner COPY Installer.cls . COPY src src USER root - 这里我们将用户切换为 root,以在 docker 中创建文件夹和复制文件。 WORKDIR  /opt/irisapp - 我们在此行中设置将文件复制到的工作目录。 RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisapp   -  这里我们为运行 IRIS 的 irisowner 用户和组授予权限。 USER irisowner - 将用户从 root 切换到 irisowner COPY Installer.cls .  - 将 [Installer.cls](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Installer.cls) 复制到工作目录的根目录。 不要漏了那个点儿。 COPY src src - 将[仓库的 src 文件夹](https://github.com/intersystems-community/objectscript-docker-template/tree/master/src/)中的源文件复制到 docker 上的工作目录的 src 文件夹中。 在下一个块中,我们运行初始脚本,其中将调用安装程序和 ObjectScript 代码: COPY iris.script /tmp/iris.script # run iris and initial  RUN iris start IRIS \     && iris session IRIS < /tmp/iris.script COPY iris.script / - 我们将 iris.script 复制到根目录。 它包含我们要调用以设置容器的 ObjectScript。 RUN iris start IRIS\  - 启动 IRIS && iris session IRIS < /tmp/iris.script - 启动 IRIS 终端并在其中输入初始 ObjectScript。 很好! 我们有 Dockerfile,它将文件导入 docker。 但还有两个文件:installer.cls 和 iris.script。我们来检查一下。 [**Installer.cls**](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Installer.cls) Class App.Installer { XData setup {                                   } ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 3, pInstaller As %Installer.Installer, pLogger As %Installer.AbstractLogger) As %Status [ CodeMode = objectgenerator, Internal ] {   #; Let XGL document generate code for this method.    Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "setup") } } 坦白说,我们不需要 Installer.cls 就可以导入文件。 这只需要一行就能完成。 但除了导入代码之外,我们经常还需要设置 CSP 应用,引入安全设置,创建数据库和命名空间。 在此 Installer.cls 中,我们创建了名为 IRISAPP 的新数据库和命名空间,并为该命名空间创建了默认的 /csp/irisapp 应用程序。 所有这些都在元素中 执行: <Namespace Name="${Namespace}" Code="${Namespace}" Data="${Namespace}" Create="yes" Ensemble="no"> <Configuration> <Database Name="${Namespace}" Dir="/opt/${app}/data" Create="yes" Resource="%DB_${Namespace}"/> <Import File="${SourceDir}" Flags="ck" Recurse="1"/> </Configuration> <CSPApplication Url="/csp/${app}" Directory="${cspdir}${app}" ServeFiles="1" Recurse="1" MatchRoles=":%DB_${Namespace}" AuthenticationMethods="32" /> </Namespace> 我们用 Import 标签导入 SourceDir 中的所有文件: <Import File="${SourceDir}" Flags="ck" Recurse="1"/> 这里的 SourceDir 是一个变量,设置为当前目录/src 文件夹: <Default Name="SourceDir" Value="#{$system.Process.CurrentDirectory()}src"/> 有了带这些设置的 Installer.cls,我们可以自信地创建一个干净的新数据库 IRISAPP,我们将从 src 文件夹导入任意 ObjectScript 代码到该数据库中。 [iris.script](https://github.com/intersystems-community/objectscript-docker-template/blob/master/iris.script) 欢迎在这里提供任何所需的初始 ObjectScript 设置代码来启动 IRIS 容器。 例如, 我们加载并运行 installer.cls,然后让 UserPasswords 永远有效,以避免第一次启动时出现密码更改请求,因为开发不需要这个提示。 ; run installer to create namespace do $SYSTEM.OBJ.Load("/opt/irisapp/Installer.cls", "ck") set sc = ##class(App.Installer).setup()  zn "%SYS" Do ##class(Security.Users).UnExpireUserPasswords("*") ; call your initial methods here halt [docker-compose.yml](https://github.com/intersystems-community/objectscript-docker-template/blob/master/docker-compose.yml) 为什么需要 docker-compose.yml,不能只用 Dockerfile 构建和运行映像吗? 可以的。 但 docker-compose.yml 能让生活更轻松。 通常,docker-compose.yml 用于启动连接到一个网络的多个 docker 映像。 当启动一个 docker 映像需要处理多个参数时,也可以使用 docker-compose.yml 来简化过程。 你可以使用它向 docker 传递参数,例如端口映射、卷、VSCode 连接参数。 version: '3.6' services: iris: build: context: . dockerfile: Dockerfile restart: always ports: - 51773 - 52773 - 53773 volumes: - ~/iris.key:/usr/irissys/mgr/iris.key - ./:/irisdev/app 这里我们声明服务 iris,它使用 docker 文件 Dockerfile,并开放 IRIS 的以下端口:51773、52773、53773。 此服务还映射两个卷:将主机主目录中的 iris.key 映射到期望的 IRIS 文件夹,以及将源代码的根文件夹映射到 /irisdev/app 文件夹。 Docker-compose 提供了更短的统一命令来构建和运行映像,无论你在 docker compose 中设置了什么参数。 总之,构建和启动镜像的命令是: $ docker-compose up -d 要打开 IRIS 终端: $ docker-compose exec iris iris session iris Node: 05a09e256d6b, Instance: IRIS USER> 此外,docker-compose.yml 有助于设置 VSCode ObjectScript 插件的连接。 [.vscode/settings.json](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.vscode/settings.json) 与 ObjectScript 加载项连接设置有关的部分如下: { "objectscript.conn" :{ "ns": "IRISAPP", "active": true, "docker-compose": { "service": "iris", "internalPort": 52773 } } } 在这里,我们看到的设置与 VSCode ObjectScript 插件的默认设置不同。 我们想要连接到 IRISAPP 命名空间(我们用 Installer.cls 创建的): "ns": "IRISAPP", 一个 docker-compose 设置指示,docker-compose 文件在服务“iris”内,VSCode 将连接到 52773 映射到的端口: "docker-compose": { "service": "iris", "internalPort": 52773 } 如果我们检查一下 52773 的相关设置,我们会看到没有为 52773 定义映射端口: ports: - 51773 - 52773 - 53773 这意味着将使用主机上的随机可用端口,并且 VSCode 将通过随机端口自动连接到 docker 上的 IRIS。 **这是一个非常方便的功能,因为它允许在随机端口上运行任意数量的带 IRIS 的 docker 映像,并让 VSCode 自动连接到它们。** 其他文件呢? 我们还有: [.dockerignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.dockerignore)  - 该文件可用于过滤你不想复制到所构建的 docker 映像中的主机文件。 通常 .git 和 .DS_Store 是必须有的行。 [.gitattributes](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitattributes) - git 的属性,用于统一来源中的 ObjectScript 文件的行尾。 如果仓库由 Windows 和 Mac/Ubuntu 所有者协作,此文件非常有用。 [.gitignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitignore) - 你不希望 git 跟踪其更改历史记录的文件。 通常是一些隐藏的操作系统级文件,例如 .DS_Store。 好了! 如何使你的仓库可被 docker 运行并且对协作友好?   1. 克隆[此仓库](https://github.com/intersystems-community/objectscript-docker-template)。 2. 复制以下所有文件: [Dockerfile](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Dockerfile) [docker-compose.yml](https://github.com/intersystems-community/objectscript-docker-template/blob/master/docker-compose.yml) [Installer.cls](https://github.com/intersystems-community/objectscript-docker-template/blob/master/Installer.cls) [iris.script](https://github.com/intersystems-community/objectscript-docker-template/blob/master/iris.script) [settings.json](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.vscode/settings.json "settings.json"){#9f423fcac90bf80939d78b509e9c2dd2-d165a4a3719c56158cd42a4899e791c99338ce73} [.dockerignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.dockerignore ".dockerignore"){#f7c5b4068637e2def526f9bbc7200c4e-c292b730421792d809e51f096c25eb859f53b637} [.gitattributes](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitattributes ".gitattributes"){#fc723d30b02a4cca7a534518111c1a66-051218936162e5338d54836895e0b651e57973e1} [.gitignore](https://github.com/intersystems-community/objectscript-docker-template/blob/master/.gitignore ".gitignore"){#a084b794bc0759e7a6b77810e01874f2-e6aff5167df2097c253736b40468e7b21e577eeb} 到你的仓库。 更改 [Dockerfile 中的这一行](https://github.com/intersystems-community/objectscript-docker-template/blob/10f4422c105d5c75111fde16a184a83f5ff86d06/Dockerfile#L15),使目录与仓库中要导入 IRIS 的 ObjectScript 匹配(如果在 /src 文件夹中则不要更改)。 就这样。 每个人(也包括你)都会将你的代码导入到新的 IRISAPP 命名空间的 IRIS 中。 **人们如何启动你的项目** 在 IRIS 中执行任何 ObjectScript 项目的法则为: 1. Git clone 项目到本地 2. 运行项目: $ docker-compose up -d $ docker-compose exec iris iris session iris Node: 05a09e256d6b, Instance: IRIS USER>zn "IRISAPP" **开发者如何为你的项目做出贡献** 1. 对仓库执行分叉,并将分叉后的仓库 git clone 到本地 2. 在 VSCode 中打开该文件夹(还需要在 VSCode 中安装 [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) 和 [ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript&ssr=false#review-details) 扩展) 3. 右击 docker-compose.yml->重启 - [VSCode ObjectScript](https://openexchange.intersystems.com/package/VSCode-ObjectScript) 将自动连接并准备好编辑/编译/调试 4. 向你的仓库提交、推送和拉取请求更改 以下是操作过程的短 gif: ![](/sites/default/files/inline/images/images/launch_and_edit1.gif) 好了! 编码愉快!  
公告
Claire Zheng · 九月 5, 2022

欢迎中文社区新版主@张特特

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主 @Tete.Zhang (张特特)! @Tete.Zhang (张特特) 目前任职于InterSystems中国,在WRC部门任职资深技术支持专家一职。 以下是@Tete.Zhang (张特特)的自我介绍: 在2015年夏天实习结束后,我于2016年正式作为技术支持工程师加入InterSystems,从那时起,我在InterSystems全球支持中心北美分部工作了六年,2022年,我调职至北京,服务于InterSystems中国,希望能为成长中的中国市场出一份力。 很高兴可以在社区与大家相遇,希望能与大家一起努力,创造更精彩的社区! 再次欢迎我们的新版主 @Tete.Zhang (张特特)👏🏼👏🏼👏🏼👏🏼👏🏼 期待你在DC成长为一名优秀版主!
文章
Nicky Zhu · 九月 7, 2021

IRIS 2021 技术文档 First Look 12--技术概要:.NET Object Persistence with XEP

本文档介绍了 XEP API,它在 InterSystems IRIS®数据平台上极其快速的 .NET 对象存储和检索支持。它向您提供了一个关于 .NET 对象持久化的 XEP 方法的进阶概述,并引导您通过一个简单的场景来演示 API 的主要功能。 这些活动被设计成只使用默认设置和功能,这样您就可以熟悉 XEP 的基本原理,而不必处理超出本概述范围的细节。有关 XEP 的完整文档,请参见 Persisting .NET Objects with InterSystems XEP (《使用 InterSystems XEP 持久化 .NET 对象》)。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 快速的对象存储和检索 面向对象编程是 .NET 框架的核心,因此 .NET 应用程序将数据建模为对象是很自然的。然而,当应用程序需要将数据存储在数据库中时,这可能会导致问题。如果您使用 ADO.NET 来存储和检索对象,您就面临着将对象数据转换为一组关系表、然后再将查询结果集转换为对象的问题。这个问题的通常解决方案是使用对象-关系映射(ORM)框架,如实体框架(Entity Framework) 来自动化这个过程。InterSystems IRIS 确实提供了实体框架(Entity Framework)接口,InterSystems 推荐它用于大型、复杂的对象层次结构。另一方面,对于执行实时数据采集等任务的应用程序,主要问题是速度而不是数据复杂性。虽然实体框架(Entity Framework)绝对不慢(如果适当优化的话),但对于需要极快地存储和检索简单或中等复杂数据的任务来说,XEP 是一个更好的选择。在大多数情况下,它比实体框架(Entity Framework)或 ADO.NET 快得多。 XEP 是如何工作的? XEP 是一个轻量级的 .NET API,它将 .NET 对象数据作为持久化事件(persistent event)来投射。持久化事件(persistent event)是 InterSystems IRIS 类的一个实例(通常是 %Persistent 的子类),包含 .NET 对象中数据字段的副本。与任何此类实例一样,可以通过对象访问、SQL 查询或直接 global 访问来检索它。 在创建和存储持久化事件(persistent event)之前,XEP 必须分析相应的 .NET 类,并将模式(schema)导入数据库。模式(schema)定义了用于存储 .NET 对象的持久化事件类的结构。如果持久化事件类不存在相应的 ObjectScript 模式,则导入模式(schema)将自动为其创建相应的 ObjectScript 模式。来自分析的信息可能是 XEP 导入简单模式所需要的全部信息。对于更复杂的结构,您可以提供额外的信息,允许 XEP 生成索引并覆盖导入字段的默认规则。 在为类创建模式(schema)之后,您可以使用各种 XEP 方法来存储、更新或删除事件、运行 SQL 查询,并通过查询结果集进行迭代。 试一试!XEP 的实际操作 现在是您自己尝试 XEP 的时候了。这个 XepSimple 演示是一个非常小的程序,但它提供了大多数关键 XEP 功能的示例,并概述了如何使用 XEP API。(想试试 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 并创建一个新的控制台(console)应用程序项目,选择 Visual C# 和 Console App (.NET Framework)(控制台应用程序(.NET 框架)) 选项。对于 Name(名称) 字段,输入 netxep。(想试试 InterSystems IRIS .NET 开发和互操作性功能的在线视频演示?请看.NET QuickStart(.NET 快速入门)!) 添加程序集引用 XEP API 被打包到 InterSystems.Data.XEP.dll 库中,该库必须安装在您的本地系统上。您可以通过克隆 repo https://github.com/intersystems/quickstarts-dotnet/tree/master/XEP 或从该 repo 下载文件来获取它。如果 InterSystems IRIS 安装在您的本地系统或您可以访问的另一个系统上,则该程序集已经安装在子目录 install-dir\dotnet\bin\v4.5 中,其中 install-dir 是实例的安装目录。 要将 InterSystems.Data.XEP.dll 的程序集引用添加到项目: 从 Visual Studio 主菜单中,选择 Project(项目) > Add Reference(添加引用)... 在出现的窗口中,点击 Browse(浏览).... 浏览到 InterSystems.Data.XEP.dll 文件的位置。 选择文件并点击 Add(添加)。 点击 OK(确定)。 在 Visual Studio Solution Explorer 中,InterSystems.Data.XEP.dll 程序集现在应该列在 References(引用)下。 添加示例类 在创建程序源文件之前,您将添加一个类,主程序会访问该类以生成用于存储的示例对象。在 Visual Studio 中,使用 Project(项目) > Add Class(添加类) 添加一个 C# 类文件到 netxep 项目。删除类文件的默认内容,并将以下代码复制并粘贴到文件中。 using System; namespace xep.samples { public class SingleStringSample { public string name; public SingleStringSample() { } internal SingleStringSample(string str) { name = str;} public static SingleStringSample[] generateSampleData(int objectCount) { SingleStringSample[] data = new SingleStringSample[objectCount]; for (int i = 0; i < objectCount; i++) { data[i] = new SingleStringSample("single string test"); } return data; } } } 因为这个类非常简单,所以 XEP 不需要任何注释就可以从中生成有效的模式。对于真实应用程序中更复杂的类,您可以使用各种选项来优化导入。 创建 XEP 演示程序 现在您可以创建 XEPSimple 演示程序了。在 Visual Studio 中,找到您在创建项目时创建的默认 program.cs 文件。删除该文件的默认内容,并粘贴下面的代码,用connection information for your InterSystems IRIS instance(您的 InterSystems IRIS 实例的连接信息)替换主机、端口、irisnamespace、用户名和密码变量的值。您可以指定所示的 USERnamespace,也可以选择在实例上创建的另一个命名空间。 using System; using InterSystems.XEP; using xep.samples; namespace XepSimpleNamespace { public class XepSimple { public static void Main(string[] args) { // Generate 12 SingleStringSample objects for use as test data SingleStringSample[] sampleArray = SingleStringSample.generateSampleData(12); // EventPersister EventPersister xepPersister = PersisterFactory.CreatePersister(); String host = "127.0.0.1"; // InterSystems IRIS host int port = 51774; // InterSystems IRIS Superserver port String irisnamespace = "USER"; // InterSystems IRIS namespace String username = "_system"; // Credentials for InterSystems IRIS String password = "SYS"; //Credentials for InterSystems IRIS xepPersister.Connect(host,port,irisnamespace,username,password); // connect to localhost xepPersister.DeleteExtent("xep.samples.SingleStringSample"); // remove old test data xepPersister.ImportSchema("xep.samples.SingleStringSample"); // import flat schema // Event Event xepEvent = xepPersister.GetEvent("xep.samples.SingleStringSample"); long[] itemIdList = xepEvent.Store(sampleArray); int itemCount = 0; for (int i = 0; i < itemIdList.Length; i++) { if (itemIdList[i] > 0) itemCount++; } Console.WriteLine("Stored " + itemCount + " of " + sampleArray.Length + " events"); // EventQuery EventQuery<SingleStringSample> xepQuery = null; String sqlQuery = "SELECT * FROM xep_samples.SingleStringSample WHERE %ID BETWEEN ? AND ?"; xepQuery = xepEvent.CreateQuery<SingleStringSample>(sqlQuery); xepQuery.AddParameter(3); // assign value 3 to first SQL parameter xepQuery.AddParameter(12); // assign value 12 to second SQL parameter xepQuery.Execute(); // get resultset for IDs between 3 and 12 xepQuery.Close(); xepEvent.Close(); xepPersister.Close(); } // end main() } // end class xepSimple } 演示程序分为三个部分,每个部分演示了 XEP 三个主要类——EventPersister、 Event 和 EventQuery 中的一个。运行时,XepSimple 演示程序执行以下任务: 首先,通过调用示例数据类(sample data class) xep.samples.SingleStringSample 这一方法生成一些示例对象。 EventPersister 是 XEP 的主要入口点(main entry point),并提供到数据库的连接。 它创建一个名为 xepPersister 的实例,该实例在数据库中建立到 User 命名空间的 TCP/IP 连接,并删除任何现有的示例数据。然后调用 ImportSchema() 来分析示例类并将模式发送到数据库,从而创建相应的 ObjectScript 模式来保存持久化 SingleStringSample 对象。 Event 封装了(encapsulate) .NET 对象和相应的数据库对象之间的接口。 一旦生成了模式(schema),xepPersister 就可以为示例类创建一个名为 xepEvent 的 Event 对象。Store() 方法将 .NET 对象数组存储为持久化事件。 EventQuery 用于准备和执行 SQL 查询的有限子集。 名为 xepQuery 的 EventQuery<SingleStringSample> 对象是通过将查询字符串传递给 xepEvent 对象的 CreateQuery() 方法创建的。 该字符串定义了一个接受两个参数(? 字符)的 SQL 查询。 参数值是通过调用 AddParameter() 定义的,调用 Execute() 来获取查询结果集。 当处理完成后,它通过调用 XEP 对象的 close() 方法进行清理。 运行 XEPSimple 程序 现在您可以构建和运行 XEPSimple 演示程序了。按 Ctrl + F5 运行程序,以便当程序结束时命令提示符保持打开状态。 下一步 XepSimple 演示的目的是让您体验 XEP,而又不陷入细节困境,它不是用于实际生产代码的模型——它甚至没有进行异常检查。最重要的简化是在示例数据中。您从一个不需要注释或其他机制来帮助模式(schema)生成和优化的类中持久化了一些很小的 .NET 对象。虽然在实际应用程序中通常需要注释和其他选项,但这些选项非常简单易用。API 也同样简单易用。 有关所有 XEP 功能的全面描述,请参见 Persisting .NET Objects with InterSystems XEP(《使用 InterSystems XEP 持久化 .NET 对象》)。 了解有关 .NET 支持的更多信息 InterSystems IRIS 提供了 .NET API,通过 SQL 表、对象和多维存储轻松访问数据库。有关每种类型的访问的详细信息,请参见以下书籍: Using the Native API for .NET(《使用 Native API for .NET》),了解从 .NET 应用程序访问 InterSystems IRIS globals。 Using ADO.NET Managed Provider Classes(《使用 ADO.NET Managed Provider Classes》),了解SQL 表访问。允许您的 .NET 项目使用完全兼容的通用 ADO.NET Managed Provider 版本访问 InterSystems IRIS 数据库。 Using the InterSystems ODBC Driver(《使用 InterSystems ODBC Driver》),了解 SQL 表访问。InterSystems ODBC 驱动程序允许 InterSystems IRIS 建立到外部应用程序的 ODBC 连接,并通过 SQL 提供对外部数据源的访问。 Persisting .NET Objects with InterSystems XEP(《使用 InterSystems XEP 持久化 .NET 对象》),了解对象访问。XEP 对事务处理应用程序进行了优化,这类程序使用复杂度从简单到中等的对象层次结构,且要求极高的对象数据持久化和检索速度。 Using the Entity Framework Provider(《使用 Entity Framework Provider》),了解对象-关系映射。提供有关使用实体框架(Entity Framework)技术访问 InterSystems IRIS 数据库的信息。 这是我们的Firstlook 文档? 对
文章
Nicky Zhu · 九月 9, 2021

IRIS 2021 技术文档 First Look 22 -- 技术概要:部署 InterSystems 分片集群

本文档将您介绍InterSystems IRIS®数据平台的分片(sharding)功能,以及它在分片集群中的使用,以水平扩展 InterSystems IRIS 的数据量。 作为本指南的一部分,您将使用 ICM 在公共云中提供的分片集群,并了解分片表(sharding a table)如何在集群中的分片之间分布其行。 分片(Sharding)如何帮助您? 您感受到大数据(Big Data)的热度了吗? 无论是否准备好了,我们都在管理比以往任何时候都多的数据,并被要求用这些数据做更多的事情——所需的响应时间也越来越短。无论您是照顾一千万名患者、每天处理数十亿的金融订单,追踪一个星系的恒星,还是监控一千个工厂的引擎,数据平台不仅要支持您目前的数据工作量,而且还必须在保持性能的同时进行扩展(Scale),以满足不断增长的需求,避免业务中断。每个特定业务的工作量对其运行的数据平台提出了不同的挑战 — 而随着工作量的增加,这些挑战将变得更加严峻。 InterSystems IRIS 包含一套全面的功能来扩展(Scale)您的应用程序,这些功能可以单独或组合应用,这取决于您的工作量的性质和它所面临的特定性能挑战。其中之一是分片(sharding),它在多个服务器上对数据及其相关缓存进行分区,为查询和数据摄取提供灵活、价优的性能扩展,同时通过高效的资源利用使基础设施价值最大化。InterSystems IRIS 分片集群(sharded cluster) 可以为各种应用程序提供显著的性能优势,特别是对于那些工作量包括以下一项或多项的应用程序: 高容量或高速数据摄入,或组合。 相对较大的数据集,返回大量数据的查询,或两者兼有。 执行大量数据处理的复杂查询,例如扫描磁盘上的大量数据或涉及大量计算工作的查询。 这些因素各自都会影响分片(sharding)的潜在收益,但如果将它们结合起来,收益可能会得到增强。例如,所有这三个因素的组合——快速摄入的大量数据、大型数据集以及检索和处理大量数据的复杂查询——使得如今的许多分析工作量非常适合进行分片(sharding)。 请注意,这些特征都与数据有关;InterSystems IRIS 分片(sharding)的主要功能是扩展数据量(sharded cluster)。但是,当涉及部分或所有这些数据相关因素的工作量也经历了来自大量用户的非常高的查询量时,分片集群也可以包括扩展用户量(scale for user volume)功能。分片(sharding)也可以与垂直扩展相结合。通过 InterSystems IRIS,您可以为工作量的性能挑战创建恰到好处的整体扩展解决方案。 分片(Sharding)是如何工作的? 分片架构的核心是跨多个系统对数据及其相关缓存进行分区。分片集群将大型数据库表水平(即按行)划分为多个 InterSystems IRIS 实例,称为数据节点(data node),同时允许应用程序通过这些实例中的任何一个访问这些表。每个数据节点在集群分片数据中的份额被称为分片(shard)。这种架构有三个优势: 并行处理(Parallel processing) 查询在数据节点上并行运行,合并查询结果,并作为完整的查询结果返回给应用程序,在许多情况下显著提高了执行速度。 分区缓存(Partitioned caching) 每个数据节点都有自己的专用缓存,而不是由单个实例的缓存为整个数据集服务,这大大降低了缓存溢出和强制降低性能的磁盘读取的风险。 并行加载(Parallel loading) 数据可以并行加载到数据节点上,从而减少摄取工作量和查询工作量之间的缓存和磁盘争夺,提高两者的性能。 一个被称为分片管理器(sharding manager)的联合软件组件会跟踪哪些数据位于哪些数据节点上,并相应地指导查询。非分片数据存储在配置的第一个数据节点上,称为数据节点 1 (它也存储代码和元数据)。从应用程序 SQL 的角度来看,分片表(sharded table)和非分片表(nonsharded table)之间的区别是完全透明的。 图 1: 一个基本的分片集群 试一试!部署和演示 InterSystems IRIS 分片集群 在这次探索中,您将 使用 InterSystems 云管理器(InterSystems Cloud Manager,ICM)在公共云中部署基本的分片集群。 ICM 是一个自动化的命令行工具,可以轻松地在云中配置基础设施,并在提供的节点上部署 InterSystems IRIS 和其他服务。ICM 负责所有需要的 InterSystems IRIS 配置,所以如果您指定了一个分片集群,该集群在部署完成后就可以使用了。 使用不同的分片键(shard key)从相同的数据中创建三个分片表(sharded table),并观察数据节点上跨分片的行的不同分布。 分片键是用来确定分片表的哪些行存储在哪些分片上的一个或多个字段。默认情况下,RowID 被用作分片键,这种分布对于大多数分片表来说是最有效的方法,因为它提供了数据均匀分布的最佳保证,并允许最有效的并行数据加载。然而,在一种情况下,用户定义的键可能是有益的。当您对在字段或用于连接它们的字段上的查询中经常连接的两个大表进行分片时,要连接的行被存储在相同的分片上,并且连接可以在每个分片上本地执行,而不是跨分片执行(across the shard),从而提供显著的性能提升。这被称为 cosharded 连接(cosharded join)。 在所有三个分片表上运行相同的查询,以证明跨分片的行分布对查询是完全透明。 为了向您介绍分片(sharding),而又不至于让您在细节上陷入困境,我们保持了简单的探索。生产中的分片集群需要计划和许多决策,所以确保不要把对分片(sharding)的探索和真实情况相混淆!例如,在设计一个生产集群时,您将检查您的架构和表,以决定哪些表将被分片,然后根据分片数据的预期工作集和服务器上数据库缓存的可用内存量,决定部署多少个数据节点(通常为 4 到 16 个)。然而,在本次探索中,您将部署一个由两个数据节点组成的基本集群。本文档末尾列出的参考资料将使您对生产中使用分片(sharding )的情况有一个很好的了解。Scalability Guide(《可扩展性指南》)中的 "Horizontally Scaling for Data Volume Sharding(《水平扩展数据卷分片[Sharding]》)"一章提供了有关分片(sharding)和分片集群的详细信息。 这些说明假定您有 InterSystems IRIS 分片(sharding)许可证并可以访问 InterSystems 软件下载。 使用 ICM 部署集群 您可以在 First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》)中找到使用 ICM 在亚马逊网络服务(Amazon Web Services)公共云平台上部署分片集群的程序;特别是在 Try It!Deploy InterSystems IRIS in the Cloud with ICM(试一试!使用 ICM 在云中部署 InterSystems IRIS)部分。您可以使用此处显示的整个程序。当您进入自定义定义.json(Customize definitions.json)时,验证每个 LicenseKey 字段的值是否是 defaults.json 文件中 LicenseDir 字段指定的暂存位置中的 InterSystems IRIS 分片(sharding)许可证的文件名。当您完成了部署阶段(部署 InterSystems IRIS[Deploy InterSystems IRIS])后,留在 ICM 容器中。 注意: 正如 Scalability Guide(《可扩展性指南》)中的 Deploying the Sharded Cluster(部署分片集群) 所描述的那样,您也可以在现有的物理、虚拟或云机器上安装 InterSystems IRIS 实例,并使用分片 API(Sharding API) 或管理门户(Management Portal)部署分片集群,或使用多种方法之一自动化部署分片集群。 使用不同的分片键以不同的方式分布行,然后查询分片表 为了了解分片集群如何根据您使用的分片键(shard key)在数据节点上的分片上对分片表(sharded table)进行分区,您将连接到集群并执行以下步骤: 创建并填充一个小型的非分片表。 使用三个不同的分片键,创建三个与非分片表具有相同字段的分片表 。 从非分片表中填充分片表。 从分片表中选择行,以查看在每种情况下,行在分片(数据节点)上的分布情况。 当一个表被分片时,RowID 值被从每个分片的不同范围分配,从相隔甚远的范围开始;相同范围的行在同一个分片上。当处理一个小表时,就像本例一样,分片的 RowID 很容易区分,清楚地告诉您哪些行在一个分片上,哪些在另一个分片上(尽管您无法分辨哪个分片是哪个)。在 RowID 上分片的表的行的分布方式与行中的数据没有关系,如果您清空并重新加载一个表,可能会有所不同。另一方面,用户定义的分片键,根据键中一个或多个字段的值来分配行,因此当您清空并重新加载表(假设值和分片数没有改变)时将是相同的。 查询所有三个表以获得其中一个字段的最大长度,来显示跨分片(across shards)的行的分布对查询是透明的。 对于这部分探索,请使用以下程序: 为任意一个数据节点实例打开终端(Terminal)窗口。 在 ICM 命令行上, 发出命令 icm session 命令,使用 -machine 选项指定一个数据节点的名称,使用 - namespace 选项指定集群命名空间 IRISCLUSTER (或者使用默认文件中的 Namespace 字段指定的命名空间,如果不同的话)。 如果您不确定节点的名称,可以使用 icm inventory 命令来显示节点名称: $ icm inventory Machine IP Address DNS Name Region Zone Acme-DATA-TEST-0001 00.53.183.209 ec2-00-53-183-209.us-west-1.compute.amazonaws.com us-west-1 c Acme-DATA-TEST-0002 00.53.183.185 ec2-00-53-183-185.us-west-1.compute.amazonaws.com us-west-1 c 选择一个节点(哪个节点并不重要)并发出命令: icm session -machine Acme-DATA-TEST-0002 -namespace IRISCLUSTER icm session 命令为指定节点上的 InterSystems IRIS 实例打开一个终端(Terminal)窗口。 如果您使用 %SYSTEM.Cluster.Sharding API 手动部署您的集群,使用 InterSystems IRIS Basics:Connecting an IDE(《技术概要:连接一个 IDE》)中的procedure described for your instance(为您的实例描述的程序),在任一实例上打开一个终端(Terminal)窗口,然后切换到 IRISCLUSTER 命名空间 (或者初始化集群时指定的命名空间,如果不同的话)。 Node: Acme-DATA-TEST-0002, Instance: IRIS USER>set $namespace="IRISCLUSTER" IRISCLUSTER> 打开终端(Terminal)SQL shell:IRISCLUSTER>do $SYSTEM.SQL.Shell() [SQL]IRISCLUSTER>> 使用以下 SQL 语句,创建并填充非分片表 test.nonsharded。 CREATE TABLE test.nonsharded (field1 CHAR(5), field2 CHAR(5)) INSERT INTO test.nonsharded (field1,field2) VALUES ('one','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('one','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('one','three') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','three') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','three') 使用 SELECT 来查看表的内容: SELECT * FROM test.nonsharded field1 field2 one one one two one three two one two two two three three one three two three three 使用 test.nonsharded 中的相同字段创建三个分片表,在第一个表中使用默认的分片键(RowID),在第二个表中使用 field1 字段,在第三个表中使用 field2 字段,并使用从 test.nonsharded 中选择的 INSERT INTO 语句填充每一个: CREATE TABLE test.rowid (field1 CHAR(5), field2 CHAR(5), SHARD) INSERT INTO test.rowid (field1,field2) SELECT field1,field2 FROM test.nonsharded CREATE TABLE test.field1 (field1 CHAR(5), field2 CHAR(5), SHARD KEY (field1)) INSERT INTO test.field1 (field1,field2) SELECT field1,field2 FROM test.nonsharded CREATE TABLE test.field2 (field1 CHAR(5), field2 CHAR(5), SHARD KEY (field2)) INSERT INTO test.field2 (field1,field2) SELECT field1,field2 FROM test.nonsharded 使用 SELECT *,%ID 来显示每个分片表的内容和它在分片上的 RowID。 SELECT *,%ID FROM test.rowid ORDER BY %ID field1 field2 ID one one 1 one two 2 two one 3 two two 4 three three 5 one three 256000 two three 256001 three one 256002 three two 256003 这个分布并不反映 field1 或 field2 的值(具有各自全部三个值的行位于两个分片上)。如果您删除、重新创建并重新加载 test.rowid,分布可能会有所不同。 SELECT *,%ID FROM test.field1 ORDER BY %ID field1 one one one field2 one 1 two 2 three 3 ID two one 256000 two two 256001 two three 256002 three one 256003 three two 256004 three three 256005 在 field1 字段上分片(sharding)会分布行,使那些具有相同 field1 值的行被放在同一个分片上。在这种情况下,值为 1 的行在一个分片上,值为 2 和 3 的行在另一个分片上,但是哪个数值最终在哪个分片上取决于有多少个分片和多少个数值。 SELECT *,%ID FROM test.field2 ORDER BY %ID field1 field2 ID one one 1 two one 2 three one 3 one two 256000 one three 256001 two two 256002 two three 256003 three two 256004 three three 256005 这里,分布是由 field2 字段的值决定的。 最后,作为分片如何将工作分配到数据节点的示例,对所有三个分片表使用以下 SELECT 语句: SELECT MAX(LENGTH(field2)) FROM <table> 在每种情况下,结果都是 5,即最长值的长度是 3,因为跨分片的行分布对查询来说是完全透明的。 MAX(LENGTH(field2)) 表达式在每个分片上独立计算,分片管理器选择它们返回结果的 MAX()。例如,当查询在 test.field2 表上运行时,一个分片返回 3,因为它在 field2 字段中只有值 1 ,而另一个分片返回 5;然后分片管理器选择 5 作为两个结果中较大的那个。 如果您愿意,可以使用 EXPLAIN 来显示查询计划,明确指出如何将工作发送到分片上: EXPLAIN SELECT MAX(LENGTH(field2)) FROM <table> 更多分片集群选项 分片集群的其他选项包括如下内容: 您可以随时添加数据节点,并跨扩展的数据节点集重新平衡现有的分片数据。重新平衡(Rebal ancing)不能与查询和更新同时进行,因此只有在分片集群离线并且没有其他分片操作的情况下才能进行。( Scalability Guide[《可扩展性指南》]中的 Add Nodes and Rebalance Data[添加节点和重新平衡数据] ) 要为集群上的数据添加高可用性,您可以将数据节点部署为镜像故障转移对。( Scalability Guide[《可扩展性指南》]中的 Mirror for High Availability[高可用性镜像])。 对于需要极低查询延迟的高级用例(可能与不断涌入的数据相冲突),可以添加计算节点 ,为查询服务提供一个透明的缓存层。当集群包含计算节点时,只读的查询会自动在计算节点上并行执行,而不是在数据节点上执行;所有写入操作(插入、更新、删除和 DDL 操作)继续在数据节点上执行。这种分工将查询和数据摄取工作量分开,同时保持并行处理和分布式缓存的优势,提高两者的性能。(Scalability Guide[《可扩展性指南》]中的 Deploy Compute Nodes[部署计算节点]) 了解有关分片(Sharding)的更多信息 要了解有关分片的更多信息,请参见 Data Platform Scalability Technology Overview(《数据平台可扩展性技术概要》) (视频) Introduction to Sharding(《分片简介》) (在线课程) Sharding Basics(《分片基础》) (在线课程) Experience InterSystems IRIS in the Cloud(在云中体验 InterSystems IRIS) (在线体验) Scalability Guide(《可扩展性指南》) First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》)