清除过滤器
文章
Michael Lei · 七月 7
InterSystems 常见问题FAQ
如果您想在InterSystems 产品启动时执行一个操作系统可执行文件,命令或者程序,可以在SYSTEM^%ZSTART routine里面写明流程 ( %ZSTART routine在 %SYS 命名空间里面创建).
在 SYSTEM^%ZSTART 里面写代码之前, 请确保他可以在任何情况下能正常工作
如果 ^%ZSTART routine 写的不对,或者没有响应或者发生错误,InterSystems 产品可能会无法启动。
更多信息,请参考一下文档。
About writing %ZSTART and %ZSTOP routines [IRIS]About writing %ZSTART and %ZSTOP routines
文章
Michael Lei · 七月 7
InterSystems 常见问题系列FAQ
InterSystems 产品里数据 (表、对象、实例数据) 是存在global 变量里的。每个global 的数据大小可以从管理门户中中点击属性查看Management Portal > System > Configuration > Local Database > Globals page, 然后在global 属性页点击计算大小Calculate Size 按钮。你可以在终端上调用^%GSIZE 来在命名空间里显示数据大小,方法如下.
USER>do ^%GSIZE Directory name: c:\intersystems\ensemble\mgr\user\ =>All Globals? No => Yes^DeepSee.ActiveTasks contains no dataInclude it anyway? No => YInclude any other similar globals without asking again? Yes =>^DeepSee.ActiveTasks contains no dataInclude it anyway? No => YesInclude any other similar globals without asking again? Yes => Yes^DeepSee.FeatureStats contains no data -- included^DeepSee.Session contains no data -- included^oddBIND contains no data -- included^oddMETA contains no data -- included^oddStudioDocument contains no data -- included^oddStudioMenu contains no data -- included^rINCSAVE contains no data -- included91 items selected from91 available globalsShow details?? No => YesDevice:Right margin: 80 =>directory: c:\intersystems\ensemble\mgr\user\ Page: 1 GLOBAL SIZE 26 Jun 2017 6:56 PM Global Blocks Bytes Used Packing Contig. -------- -------- --------------- ------- ------- CacheMsg 1 3,812 47 % 0 DeepSee.ActiveTasks 1 24 0 % 0 DeepSee.AgentLog 1 6,008 74 % 0 DeepSee.Agents 1 688 8 % 0 DeepSee.BucketList 1 76 1 % 0 DeepSee.Cache.Axis 25 142,616 70 % 14 DeepSee.Cache.Listing 15 87,728 72 % 11 DeepSee.Cache.Results 31 183,200 72 % 17 DeepSee.Cubes 3 17,936 73 % 0 to continue or '^' to STOP:
文章
Michael Lei · 七月 7
InterSystems 常见问题系列FAQ
如果要让超时功能失效, 在DSN设置查询超时为disabled:
Windows Control Panel > Administrative Tools > Data Sources (ODBC) > System DSN configuration
如果勾选了Disable query timeout , 超时就会失效.
如果想在应用侧修改,你可以在ODBC API 层设置:在连接数据源之前,调用ODBC SQLSetStmtAttr功能设置SQL_ATTR_QUERY_TIMEOUT 属性
文章
Michael Lei · 七月 25
InterSystems 常见问题FAQ
要编译包含映射修饰符的类rountine,请指定编译器修饰符“/mapped=1”或“/mapped”。例如,执行以下操作:
[示例 1] 获取类列表并编译
do $System.OBJ.GetClassList(.list,"/mapped")
// build your classes starting from .list
do $System.OBJ.Compile(.list)
[示例 2] 编译所有类
do $system.OBJ.CompileAll("/mapped")
文章
Louis Lu · 八月 6
在使用 InterSystems ObjectScript 进行编程时,当你定义了属性property、查询query或者索引index,系统会在编译的过程中自动创建与之相关的一些方法,这篇文章对这些方法做了些总结:
属性Properties
1. 假设你定义了一个属性 Property, 下面的方法会被自动创建
ClassMethod PropertyGetStored(id)
对于数据类型属性,这个函数将返回其逻辑值,对于对象属性,返回id。这是一个对类global数据的封装,也是获取单例属性值(singular property value)最快的方法。此方法仅适用于已持久化存储的属性。
这里是一段采用多种方法读取数据的对比代码,用于测试各种访问数据方式的时间差异,其结果是:
Iterations: 10000
Object access: .130111
GetStored access: .014388
SQL access: .020268
Global access: .007717
Object access takes 904.30% of GetStored time
Object access takes 641.95% of SQL time
Object access takes 1686.03% of Global time
GetStored access takes 70.99% of SQL time
GetStored access takes 186.45% of Global time
SQL access takes 262.64% of Global time
其中:
Object access 是打开一个对象,并读取其属性值
SQL access 使用嵌入式SQL
GetStored 使用本文所述自动生成的方法
Global 使用直接读取保存属性值的global
2.
Method PropertyGet()
这个函数是属性的getter,可被重新定义。
3.
Method PropertySet(val) As %Status
这个函数是属性的setter, 可被重新定义。
对象属性 Object properties
1. 如果是一个对象属性,有关ID以及OID的方法会被创建
Method PropertySetObjectId(id)
这个方法通过对象的Id设置属性值,也就是不需要首先打开一个对象,再设置该对象的属性值。
例如下面定义了两个类
Class Person Extents %Persistent {
Property EmployedAt As Company;
}
Class Company Extends %Persistent {
}
通常来说你要将Company赋值给Person是这样写的:
set person = ##class(Person).%New()
set companyId = 123
set company = ##class(Company).%OpenId(companyId)
set person.EmployedAt = company
但是如果你使用PropertySetObjectId方法,就可以这样写:
set person = ##class(Person).%New()
set companyId = 123
do person.EmployedAtSetObjectId(companyId)
可以看到,这样写的不同点就是,你不需要打开Company这个对象,就可以直接赋值。
2.
Method PropertyGetObjectId()
这个方法返回属性值的Id
3.
Method PropertySetObject(oid)
这个方法通过OID设置属性值
4.
Method PropertyGetObject()
这个方法返回属性值的OID
数据类型属性Datatype properties
1. 对于数据类型属性会生成多个在不同格式间转换的函数:
ClassMethod PropertyDisplayToLogical(val)
ClassMethod PropertyLogicalToDisplay(val)
ClassMethod PropertyOdbcToLogical(val)
ClassMethod PropertyLogicalToOdbc(val)
ClassMethod PropertyXSDToLogical(val)
ClassMethod PropertyLogicalToXSD(val)
ClassMethod PropertyIsValid(val) As %Status
检查val是否为有效的属性值
2.
ClassMethod PropertyNormalize(val)
返回标准化的逻辑值
注意:
定义的关系(Relationship)也是属性,可以使用 get/set 方法
输入值 val 总是指逻辑值,格式转换方法除外
索引Indexes
1. 对于命名为"Index"的索引,下面函数会被自动创建
ClassMethod IndexExists(val) As %Boolean
该函数判断val的索引是否存在。
唯一索引Unique Indexes
1. 对于唯一索引,下面函数会被自动创建
ClassMethod IndexExists(val, Output id) As %Boolean
判断val的索引是否存在,并且通过第二个参数返回该对象的id。
2.
ClassMethod IndexDelete(val, concurrency = -1) As %Status
通过val,删除索引
3.
ClassMethod IndexOpen(val, concurrency, sc As %Status)
通过val返回该对象。
注意:
索引可基于多个属性创建,如何使基于多个属性创建的索引,那么函数的输入参数则是多个,比如这样的索引定义:
Index MyIndex On (Prop1, Prop2);
那么IndexExists函数则会是下面这样的:
ClassMethod IndexExists(val1, val2) As %Boolean
其中val1对应于Prop1的值, val2对应于Prop2的值,其他的函数遵循同样的逻辑。
Caché 生成的 IDKEY索引,是基于ID字段创建的索引。它同样可被重写,以及包含多个属性。例如,检查该类是否有某属性定义:
Write ##class(%Dictionary.PropertyDefinition).IDKEYExists(class, property)
所有索引函数检查的都是逻辑值
文档参见这里
查询Queries
1. 对于查询queries(它可以是一个简单的SQL查询,或者用户自定义的类的查询),命名为"Query"Func的方法会被自动创建:
ClassMethod QueryFunc(Arg1, Arg2) As %SQL.StatementResult
它会返回一个 %SQL.StatementResult,可被用于便利查询。比如对于在Samples命名空间下的Sample.Person类,定义了一个ByName的查询,它接受一个输入参数,它可以直接通过下面方法在代码中调用:
Set ResultSet=##class(Sample.Person).ByNameFunc("A")
While ResultSet.%Next() { Write ResultSet.Name,! }
另外,这里是一个在GitHub上的示例,用于演示上面的方法使用。
公告
Claire Zheng · 十月 13
开发者社区的成员,大家好!
我们都喜欢编码,但我们应该时不时地放下代码去锻炼身体! InterSystems 步行挑战将帮助您恢复精力、增强体质。 历史悠久的 Salt Road 在几个世纪以前连接起欧洲,沿着这条传奇的贸易路线,踏上从吕贝克到吕讷堡的虚拟赛道。
赢取跑步机、智能手表和奖牌等精美礼品。
👟🚶🧑🦼系紧鞋带,放下工作,更好地编码! 🔋💻💪
📅日期:9 月 23 日 - 10 月 20 日(可能有变动)
想加入吗? 详细信息如下。
运作方式
下载应用或使用 Web 版本,输入任务代码 SupplyChain,便可按照您自己的节奏在任何地点免费开启您的赛程。 您可以作为步行者、跑者或轮椅使用者参赛。 只需在应用中选择参赛身份。如果您参加的有些晚,您可以上传您设备中的历史数据。在我们的排行榜上保持活跃状态,分享您的步数变动,让每位参赛者都受到鼓舞并进入挑战模式!
奖励和奖品
完成比赛的过程就是对自我的奖励,但我们还为参赛者准备了一些特殊奖品。 每位完成 Salt Road 的参赛者都会获得一枚奖牌。
此外,您还将参加竞赛。 排行榜的目标是以最快的速度通过步行、跑步或乘坐轮椅的方式走完 Salt Road。 我们将统计每个人的个人用时并进行奖励。
成绩位列前十名的参赛者可以赢得更多奖品:
第 1 名:APPLE Watch Series 10 智能手表(GPS + 蜂窝网络,46 毫米铝金属表壳,氟橡胶表带)
第 2 名 - 第 10 名:二合一 Sportstech Laufband sWalk Plus
第 11 名 - 第 30 名:精美水壶
我们欢迎 InterSystems 员工和承包商参加活动,但此类参赛者没有资格赢得主要奖品。
说明
要加入我们的挑战,只需在使用 Web 版本时点击“加入”按钮。 要使用应用,请在 Apple App Store 或 Google Play 商店中下载 My Virtual Mission 应用。 填写详细信息进行注册后,再次点击加入链接即可获取我们的任务。
为了将每一步都计入成绩,您需要将 My Virtual Mission 与您的健康相关应用同步。 您能够关联多种第三方健身跟踪器,包括 Apple Health、Google Fit、Under Armour、Garmin、FitBit、Strava 和 Adidas Running。 您可以通过 My Virtual Mission 应用管理您的关联:
打开 My Virtual Mission 应用
在主屏幕中,点击屏幕右下角的菜单
点击关联
选择所需的健身跟踪器。 关联健身跟踪器后,选择查看任务进入您的任务页面。 从右侧的下拉菜单中选择设置。 随后,您将能够更新对步行任务的发布偏好设置。
您也可以手动发布您走过的距离:点击任务页面左下角的“+”图标。 点击手动发布距离,并输入所有信息和照片作为证据(例如跑步机距离)。 不过,如果使用此方法,您的成绩需要一段时间才会出现在排行榜中。
保持健康,祝您好运!
文章
Claire Zheng · 四月 21, 2021
近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问吕正之讲解了“InterSystems Caché架构、备份与恢复”。
文章
Claire Zheng · 四月 3, 2023
亲爱的社区开发者们:
感谢第四届 InterSystems 技术征文大赛(InterSystems IRIS 教程)的优秀参与者们,我们有很棒的新文章供您阅读和欣赏!
🌟 24 篇精彩文章🌟
是时候宣布此次竞赛优胜者啦!
让我们认识一下获奖者和他们的文章:
⭐️ 专家奖——由 InterSystems 专家选出的获奖者:
🥇 第一名: InterSystems Embedded Python in glance 作者: @Muhammad Waseem
🥈 第二名: InterSystems Embedded Python with Pandas - 第 1 部分,作者:@Rizmaan Marikar
🥉第三名: SQLAlchemy - 将 Python 和 SQL 与 IRIS 数据库结合使用的最简单方法 作者:@Heloisa Paiva
⭐️开发者社区奖—— 由社区成员选出的获奖者,获得最多赞的文章:
🏆 设置 VS Code 以使用 InterSystems 技术 作者:@Maria Gladkova
此外!
⭐️我们想根据贡献的数量奖励更多的作者:
@Robert Cemper:4 篇文章!
@Heloisa Paiva: 3 篇文章!
@Iryna Mykhailova: 3 篇文章!
这些作者将获得适用于 iPad 的 Magic Keyboard Folio 或 Bose Soundlink Micro 蓝牙扬声器!
让我们祝贺所有参加 英文社区 #4第四届技术征文大赛的英雄们:
@Robert Cemper
@Heloisa Paiva
@Muhammad Waseem
@王喆
@Iryna Mykhailova
@Maria Gladkova
@Yone Moreno
@Akio Hashimoto
@Julian Matthews
@Daniel Aguilar
@water huang
@Oliver Wilms
@Rizmaan Marikar
@姚 鑫
@Zhong Li
@Jude Mukkadayil
@Roger Merchberger
谢谢你们!您为我们的开发社区做出了卓越的贡献!
我们将联系参赛者以寄送礼品。 再次感谢所有中国选手的热情参与!@姚 鑫@王喆@water huang
公告
Claire Zheng · 八月 19, 2021
亲爱的社区开发者们,大家好!
欢迎积极参与新一轮InterSystems开发者竞赛!
🏆 InterSystems开发者竞赛:InterSystems IRIS Analytics 🏆
竞赛时间:2021年8月23日-9月12日
奖金总额: $8,750
登录页面即可参赛: https://contest.intersystems.com
奖项设置
1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出:
🥇 第一名 - $4,000
🥈 第二名 - $2,000
🥉 第三名 - $1,000
2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用:
🥇 第一名 - $1,000
🥈 第二名 - $500
🥉 第三名 - $250
如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金
谁可以参加?
任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个!
👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。
请注意,要在您的README文件中标注您的团队成员——社区用户profile
参赛时间安排
🛠 8月23日 - 9月5日: 应用开发、提交阶段
✅ 9月 6日 - 12日: 投票阶段
注意:在整个参赛期间(开发与投票期间,即8月23日-9月12日),开发者可持续编辑、提升其应用
主题
💡 应用InterSystems IRIS开发分析解决方案(Analytics Solution) 💡
使用一个或多个InterSystems IRIS分析功能,如:
Adaptive Analytics 自适应分析(AtScale)
InterSystems Reports (Logi)
InterSystems BI (DeepSee)
InterSystems NLP (iKnow)
创造一个简单的、引人注目的、清晰的可视化产品和/或故事。
以下是参赛须知:
有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。
该应用应该在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition 上工作。
该应用需开源并在GitHub上发布。
该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。
资源助力
1. 示例应用程序和说明:
1.1. Adaptive Analytics(自适应分析):
Adaptive Analytics in Action (视频)
1.2 InterSystems报告:
A look at InterSystems Reports (视频)
InterSystems Reports Resource guide
Running InterSystems Reports in containers
IRIS reports server demo (OEX)
1.3 IRIS BI 案例:
IRIS Analytics Template
Samples BI
Covid19 analytics
Analyze This
Game of Throne Analytics
Pivot Subscriptions
Error Globals Analytics
Creating InterSystems IRIS BI Solutions Using Docker & VSCode (视频)
The Freedom of Visualization Choice: InterSystems BI (视频)
InterSystems BI(DeepSee) Overview (线上课程)
InterSystems BI(DeepSee) Analyzer Basics (线上课程)
1.4 InterSystems NLP (iKnow):
iKnow Source Code
Samples Aviation
Set Analysis
iKnow First Look (线上课程)
2. Sample数据:
Hole Foods database for IRIS BI (与SamplesBI包一起安装)
Adventure Works, zip
Synthea
3. 将数据导入IRIS的工具:
CSVGEN and CSVGENUI
S3 External Table
4. IRIS初学者
Build a Server-Side Application with InterSystems IRIS
Learning Path for beginners
5. 如何将您的APP提交给大赛
如何在InterSystems Open Exchange上发布应用程序
如何把参赛APP提交给大赛
参赛评比
投票规则即将发布,敬请期待!
So!
期待您的精彩提交!加入我们的编程马拉松,赢取大奖
❗️ 点击此处,查看 官方竞赛条款解读❗️
文章
Claire Zheng · 一月 21, 2021
大家好!
我想跟大家分享一个个人项目,该项目始于工作中的一个简单需求:“能否知道我们使用了多少个Caché许可证?”
在阅读社区的其他文章时,我发现了一篇David Loveluck写的非常棒的文章:APM——使用Caché History Monitor。
我根据David的这篇文章,开始使用Caché History Monitor并显示所有这些信息。
在面临“选择哪种很酷的技术”这个问题时,我决定使用简单而强大的CSP,这样我的客户可以认识到Caché不仅仅是MUMPS/终端。
在创建了页面以显示许可、数据库增长和CSP会话的历史记录后,我决定为System Dashboard和进程页面创建一个新设计。
我的Caché实例运行得良好。
但是,如果使用IRIS呢?根据Evgeny Shvarov的文章:在InterSystems IRIS开发存储库中使用Docker,我实现了docker技术,并把代码放到了GitHub上,现在大家只需几个步骤就可以进行尝试。
如何运行?
如要使用这里的repo进行编码,请执行以下操作:
1. 通过Clone/git命令将repo 更新到任意本地目录中:
$ git clone https://github.com/diashenrique/iris-history-monitor.git
2. 打开这个目录下的终端,并运行:
$ docker-compose build
3. 在项目中运行IRIS容器:
$ docker-compose up -d
如何测试
打开浏览器,并转到链接:http://localhost:52773/csp/irismonitor/dashboard.csp
使用用户名_SYSTEM可以运行仪表盘dashboard和其他功能。
系统仪表盘
系统仪表盘(System Dashboard)可展示:
·许可
·系统时间
·应用程序错误
·缓存过程
·CSP会话
·Lock Table
·日志空间
·日志状态
·ECP AppServer
·ECP DataServer
·编写守护进程
·缓存效率
·严重警告
折线图小工具每5秒绘制一个点:
系统菜单
系统进程
进程过滤器
通过使用不同的过滤器可以实现你所需的结果。也可以使用“Multiple Sort(多重排序)”,按Shift +单击列标题,甚至可以将数据网格导出到Excel!
History Monitor(历史记录监控器)
CSP会话和许可的History Monitor可显示三个部分的信息:
·每5分钟
·每天
·每小时
“Database Growth”部分只显示当日信息。历史记录页面共享以下功能:
Date Range Picker(日期选择插件)
默认值为“过去7天”
Chart / Data Table(图表/ 数据表)
在每个部分的右上角有两个按钮(Chart / Data Table [图表/ 数据表])
Data Table(数据表)显示创建图表所用的信息,同样可以以Excel格式下载。
Excel中显示CSP中定义的相同格式、内容和组。
缩放
所有图表都有Zoom(缩放)选项,以可视化方式显示更多详细信息。
平均值和最大值
对于“每小时”和“每天”部分,图表显示的是平均值和最大值。
平均值
最大值
希望这篇文章对您有用!
注:本文为译文,点击此处阅读原文,原文由Henrique Gonçalves Dias撰写。
公告
Claire Zheng · 一月 7, 2021
大家好!InterSystems Global Masters 倡导中心与开发者社区紧密联系并不是秘密。 为开发者社区做出任何贡献都会带来 Global Masters 积分。 所以, 我们准备了一份关于如何在 Global Masters 以最佳方式获得积分的简短指南。
如何在 GLOBAL MASTERS 获得积分
在开发者社区上发布英文帖子
100
第一次在社区评论
回答一个问题 / 发表一个评论(英文)
300
30
第 1 个被标记为“已接受”的回答
1000
之后的每一个“已接收”回答
150
第5/10/25/50个“已接收”回答
4000/8000/20000/40000
翻译一篇文章
50
在 DC 上问第1/5/10/25/50个问题
500/2000 /5000 /15000/30000
在 DC 上发布第1/5/10/25/50个帖子
1500/7500/15000/40000/75000
在 Open Exchange 发布一个应用程序
800
对每一个ZPM应用积分奖励
400
在Open Exchange发布第1/5/10/25个应用程序
1000/10000/25000/75000
帖子浏览量达到750+/2000+/5000+/15000+
600/2500/7000/20000
在开发者社区阅读一篇帖子
10
看一个视频
20
通过社交媒体分享一次(帖子/视频)
40
发布的第1/2/3/4/5 篇带“最佳实践”标签的文章
1000/3000/7000/10000/15000
在Open Exchange上您的应用第50/100/250/500/1000次下载
2500/5000/7500/12500/25000
对 InterSystems / InterSystems 产品作一次评述
2 000-3 000
邀请成员加入开发者社区
600
为您的OEX应用创建一个video
3000
*仅计算在 Global Masters 倡导中心注册后发布的帖子。
完成挑战,获得徽章并升级:Insider > Advocate > Specialist > Expert > VIP。 您的级别越高,可获得的奖励越有趣!
欢迎点击查看更多有关 Global Masters 的其他信息:
如何加入 InterSystems Global Masters
Global Masters 徽章说明
Global Masters 级别说明
Global Masters 计划的变更
如果您尚未加入 InterSystems Global Masters 倡导中心,现在就开始行动吧! 欢迎在本帖评论中提出您的问题。 欢迎大家多参与Global Master,多积分,多贡献,提高等级,赢取礼品!
@Young Zheng @An Xingqi @jinhui hu @wenyang zhang @guoguo wang @shikai ren @chaolong huang @yabin duan @鹏飞 楚 @智辉 李 @SHAN HU @Wendy Wu
@Hao Wang @Z C @Zhaoying Li @Neal Wu @liu yaquan @qu qu @wang wei @guo meiya@yajing xu @yue li @权权 苏 @xiaohu xiong @yadong zhao @Yi Han @Wen Zhou @jie zhang @张 恒 @guo wenheng @Jing Li @迪 文
文章
Nicky Zhu · 一月 8, 2021
在本文中,我们将讨论孤立消息。
## 什么是孤立消息
每个消息正文都与一个保存元数据的消息标头相关联。 标头保存源配置名称、目标配置名称、创建时间、处理时间、关联的消息正文引用、会话信息、消息正文类名、消息状态等信息。 当有消息正文记录没有相应的标头记录时,这些消息正文称为孤立消息正文。 我们将讨论可能导致孤立消息正文产生的原因。
### 仅清除标头
在清除任务设置中,**BodiesToo** 设置用于指定是否将消息正文与消息标头一起清除。 如果**关闭**此设置,清除任务将只删除消息标头,而保留消息正文。 这些消息正文将成为孤立记录,因为所引用的标头已被删除。 如果清除消息标头但保留消息正文,则管理门户将无法清除孤立消息正文。 在这种情况下,必须以编程方式清除消息正文。
![](/sites/default/files/inline/images/purgetask_1.jpg)
请参阅有关清除任务的文档
[http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EGMG\_purge#EGMG\_purge_basic](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EGMG_purge#EGMG_purge_basic)
### 复杂的消息正文类(对象值属性)
当 Ensemble 清除某条消息正文时,不一定删除该消息正文的对象值属性。 具体来说,只有当其他对象是序列对象或子对象(由关系定义)时,才会删除这些对象。 对于其他对象,必须通过在消息正文类中定义删除触发器或实现 **%OnDelete()** 方法来适当地处理删除。
OnDelete 实现的示例代码
Class Sample.Address Extends %Persistent{
/// The street address.
Property Street As %String(MAXLEN = 80);
/// The city name.
Property City As %String(MAXLEN = 80);
/// The 2-letter state abbreviation.
Property State As %String(MAXLEN = 2);
/// The 5-digit U.S. Zone Improvement Plan (ZIP) code.
Property Zip As %String(MAXLEN = 5);
}
Class Sample.Person Extends %Persistent{
/// Person's name.
Property Name As %String [ Required ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
/// Person's Date of Birth.
Property DOB As %Date;
/// Person's home address.
Property Home As Address;
/// Person's office address.
Property Office As Address;
///Callback for object deletion
ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private ]{
// Delete the property object references.
Set tSC = $$$OK, tThis = ##class(Sample.Person).%Open(oid)
If $ISOBJECT(tThis.Home) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
If $ISOBJECT(tThis.Office) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
Quit tSC
}
///Callback/Trigger for SQL delete
Trigger OnDelete [ Event = DELETE ]{
// Delete the property object references. {%%ID} holds the id of the record being deleted.
Set tID={%%ID}
Set tThis = ##class(Sample.Person).%OpenId(tID)
If $ISOBJECT(tThis.Home) Do ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
If $ISOBJECT(tThis.Office) Do ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
Quit
}
}
### 已创建但从未发送到其他主机的消息对象
当一条消息被发送/转发到其他主机时,Ensemble 会创建一个新的消息标头,并关联相应的消息正文。 如果在业务服务/流程中创建的消息正文/对象实例已保存到磁盘/数据库,但从未在生产过程中发送到其他主机,它将没有关联的标头,并保留为孤立消息正文。 最佳实践是不创建消息正文,除非它将被转发,或者不对该对象实例调用 %Save()(在将消息放入目标配置队列之前,SendRequestSync/SendRequestAsync API 将保存该对象实例)。 这样,除非将消息正文对象发送到其他主机,否则它将不会持久化。
此问题的最常见原因是开发人员:
克隆了消息正文,且从未转发克隆的消息正文
在上下文变量 (BPL) 中创建了消息正文对象,且从未转发。
## 孤立消息的影响
孤立消息不会被清除任务清除。 这些消息将占用磁盘空间,并且随着它们数量的增长,磁盘使用量也会成比例增加。 不仅消息正文数据使用磁盘空间,每条孤立消息正文记录的任何索引/搜索表条目也都占用磁盘空间。
## 识别孤立消息
可以通过查询消息标头和正文来确定孤立消息是否存在。 每个消息标头都引用相应的消息正文。 消息正文对象 Id 引用存储在标头的 MessageBodyId 属性中,消息正文类名存储在标头的 MessageBodyClassName 属性中。
在 HL7 消息表中查找孤立消息的示例查询:
SELECT HL7.Id FROM EnsLib_HL7.Message HL7
LEFT JOIN Ens.MessageHeader hdr
ON HL7.Id=hdr.MessageBodyId
WHERE hdr.MessageBodyId IS NULL
上面的查询将返回所有没有相应标头的 HL7 消息。 可以将该查询修改为查询任何其他消息类型,只需替换消息正文表名即可。
## 清除孤立消息
管理门户无法提供清除孤立消息正文的方法。 在这种情况下,必须以编程方式清除消息正文。 在 **ENSDEMO** 数据库中,类 **Demo.Util.CleanupSet** 提供了一个如何执行此操作的示例。 该例程也执行深度清除,同时处理对象属性引用。
还可以参考另一个例程来清除孤立消息,但该例程不执行深度清除,只对删除消息正文有帮助。 我在下面附上可下载源码的 github 链接:
最佳做法是始终:
1. 避免编程错误(如前面所讨论)以防止出现孤立消息
2. 只有需要正文并且知道只能以编程方式清除这些消息正文时,才将清除任务设置成关闭 BodiesToo 设置。
3. 实施关系或针对持久对象属性实现 OnDelete。
我希望本文对您构建生产环境有所帮助。 如果您有任何问题或疑虑,请联系我们。 谢谢。
公告
Nicky Zhu · 一月 8, 2021
现在,InterSystems **系统警报和监视**(简称 InterSystems _SAM_)第 1 版 (v1.0) 发布了预览版本。
InterSystems SAM v1.0 为基于 InterSystems IRIS 的产品提供现代化的监视解决方案。 其可对集群进行高级别查看,并且能够以单节点方式可视化深入探视指标,同时提供警报通知。 该第 1 个版本提供对一百多个 InterSystems IRIS 内核指标的可视化,并且用户可以根据自己的喜好扩展默认提供的 Grafana 模板。
V1.0 旨在成为简单直观的基准。 请进行尝试并向我们发送反馈,帮助我们使其变得更棒!
从版本 2019.4 开始,SAM 可以显示来自基于 InterSystems 的实例中的信息
SAM 仅以容器格式提供。 您将需要 SAM 管理器容器,以及一小组额外的开源_组件_(Prometheus 和 Grafana),它们由组合文件自动添加。
可从以下位置获取 SAM 组件和 SAM 管理器社区版
* [WRC 预览页面](https://wrc.intersystems.com/wrc/coDistPreview.csp):分别为“SAM 组件”和“SAM 管理器”
* 如果您要在 docker-compose 运行之前下载,可通过外部源[SAM 组件 Github repo](https://github.com/intersystems-community/sam) & [Docker Hub 上的 SAM 管理器](https://hub.docker.com/_/intersystems-system-alerting-and-monitoring)(后一个链接可能在几个小时内不可用,但容器是可获取的)
如果您正在旅行,或偏爱通过语音收听有关什么是 SAM 方面的提问与回答,我们为您准备了以下播客:
可在[此处](https://docs.intersystems.com/sam/csp/docbook/Doc.View.cls?KEY=ASAM)找到 SAM 文档