使用Dejournal Filter在InterSystems IRIS/Caché上实现CDC功能

使用Dejournal Filter在InterSystems IRIS/Caché上实现CDC功能 InterSystems IRIS/Caché的CDC

InterSystems IRIS/Caché未提供开箱即用的变更数据捕获(CDC)工具,而且由于其多模型建模能力和底层的多维存储模型,相对于关系型数据库的单一模型,CDC在InterSystems IRIS/Caché上会更复杂一些。例如通过Journal日志记录的是底层持久化多维数组的数据变更,而不是SQL table的变更。

通常,在应用层面实现变更数据捕获是更灵活和简单的方式,例如通过设置触发器、类的DSTIME参数。但如果无法在应用层做CDC,可以考虑使用InterSystems IRIS/Caché的Journal和强大的开发能力获取数据变更。

这里介绍使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。

Dejournal 过滤器

InterSystems IRIS/Caché的 Dejournal 过滤器用于在Reporting类型的异步镜像成员上过滤Journal记录。当配置了Dejournal 过滤器后,异步镜像成员在redo journal前会自动调用Dejournal过滤器类的方法RunFilter,并传入以下参数:

MirrorDBName:镜像数据库名称;
GlobalReference:Global节点(包括下标);
RecordType:操作类型,为S(Set)和K(Kill);
Address:Journal记录在Journal文件中的偏移量。
我们可以利用自定义的Dejournal过滤器,捕获持久化多维数组(Global)的数据变化,并输出给外部系统。

在这里插入图片描述
注意:

如果仅为实现CDC,并不需要配置镜像备机。
Dejournal过滤器只能配置在Reporting类型的异步镜像成员上。
镜像配置不在本文内容里,请参考文档:
[IRIS] https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror
[Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror

编写Dejournal过滤器

InterSystems IRIS/Caché提供镜像Dejournal系统类 - SYS.MirrorDejournal。对于用户自定义过滤逻辑,通过继承于SYS.MirrorDejournal的子类来实现。

在Reporting异步镜像成员的%SYS命名空间(IRISLIB数据库)下创建SYS.MirrorDejournal的子类,命名应以Z或z开头,以避免升级时被覆盖,例如命名为ZCustom.MirrorDejournal。
注意: IRISLIB数据库默认是只读的,需要先将其修改为可读写。

Override该类的RunFilter方法,将数据变更捕获的逻辑放在该方法里,并根据需要返回1或0。1代表这个global变更需要dejournal,0代表不需要。即便仅仅是为实现CDC,建议在Reporting异步镜像成员恢复所有数据,即让该方法返回1,从而不需要影响生产系统,直接从Reporting异步镜像成员上获取所有的变更数据。

例如,将global的数据变更记录在^CDCLog中:

Class ZCustom.MirrorDejournal Extends SYS.MirrorDejournal
{
Method RunFilter(
MirrorDBName As %String,
GlobalReference As %String,
RecordType As %String,
Address As %Integer) As %Integer
{
Set ^CDCLog( $I( I (I(^CDCLog))=$lb(MirrorDBName,GlobalReference,RecordType,Address)
Quit 1
}
}

配置Dejournal过滤器

在Reporting异步镜像成员上,配置其镜像Dejournal过滤器为上面创建的过滤器类的名称。

在这里插入图片描述

后记

今天有人问到,如何获取变更的值和变更前的值。可以使用$ J R N N E W V A L ( A d d r e s s ) 、 JRNNEWVAL(Address) 、 JRNNEWVAL(Address) J R N O L D V A L ( A d d r e s s ) 在 上 面 的 R u n F i l t e r 方 法 中 获 取 变 更 后 和 变 更 前 的 数 据 。 注 意 , JRNOLDVAL(Address)在上面的RunFilter方法中获取变更后和变更前的数据。注意, JRNOLDVAL(Address)RunFilter J R N N E W V A L ( A d d r e s s ) 、 JRNNEWVAL(Address) 、 JRNNEWVAL(Address)$JRNOLDVAL(Address)这2个宏定义在%syJrnRecord.inc文件里,因此需要将这个include文件加入ZCustom.MirrorDejournal类定义:Include %syJrnRecord
————————————————
版权声明:本文为CSDN博主「iscciris」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iscciris/article/details/100205412

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值