InterSystems IRIS/Caché的CDC

InterSystems IRIS/Caché未提供开箱即用的变更数据捕获(CDC)工具,而且由于其多模型建模能力和底层的多维存储模型,相对于关系型数据库的单一模型,针对于SQL的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,并传入以下参数:
 1. MirrorDBName:镜像数据库名称;
 2. GlobalReference:Global节点(包括下标);
 3. RecordType:操作类型,为S(Set)和K(Kill);
 4. Address:Journal记录在Journal文件中的偏移量。

我们可以利用自定义的Dejournal过滤器,捕获持久化多维数组(Global)的数据变化,并输出给外部系统。

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

编写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 ($^CDCLog))=$lb(MirrorDBName,GlobalReference,RecordType,Address)Quit 1}
}

配置Dejournal过滤器

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

后记

今天有人问到,如何获取变更的值和变更前的值。可以使用`$$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)`在上面的RunFilter方法中获取变更后和变更前的数据。注意,`$$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)`这2个宏定义在%syJrnRecord.inc文件里,因此需要将这个include文件加入ZCustom.MirrorDejournal类定义:Include %syJrnRecord

又,在InterSystems IRIS上修改并编译dejournal过滤器类后,需要重启异步镜像成员的Mirror,以使更改生效。

CDC系列

更多的CDC选项实现,请参考:

1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能

2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC

3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系

4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能

精华文章置顶--CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能...相关推荐

  1. 精华文章置顶--使用VSCode 进行IRIS 开发

    VSCode 是目前很流行的一款免费开发工具,IRIS也支持使用其进行连接和开发,相比Studio 只能在windows 环境使用,Vscode 可以跨平台使用. 我们传统的工具Studio 是连接代 ...

  2. hexo博客优化之文章置顶+置顶标签

    本文首发于wangwlj.com 博文置顶 一种方法是手动对相关文件进行修改,具体可参考这篇文章. 另一种方法就是,目前已经有修改后支持置顶的仓库,可以直接用以下命令安装. $ npm uninsta ...

  3. Blog外挂之:文章置顶

    Blog外挂之:文章置顶 By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) 许多朋友想要文章置顶的功能.比如博客园的这个样子: 图片截自爆牙齿的b ...

  4. php置顶文章,php实现文章置顶功能的方法

    本文实例讲述了php实现文章置顶功能的方法.分享给大家供大家参考,具体如下: 昨天客户让做文章置顶的功能.自己以前没做过.靠着同事的指点才做了出来.本来挺简单的事情,被自己搞了好久.自己真的缺乏对程序 ...

  5. wordpress如何设置文章置顶以及区分置顶文章与普通文章

    很多博客都有自己的置顶文章,在默认情况下WP对置顶文章只是将它们的位置排在前面,除了位置差异外,跟其他文章是没有任何区别的.那我们怎样才能将它们区别开来呢?我这里有几种方法:  一.在WordPres ...

  6. 【Hexo搭建个人博客】(十三)Next主题中添加首页文章置顶功能及置顶图标

    1. 安装插件 npm uninstall hexo-generator-index --save npm install hexo-generator-index-pin-top --save 如果 ...

  7. hexo博客文章置顶功能实现的两种方法

    写在前面 本文主要描述了如何实现hexo文章置顶功能,讲述了通过修改源码和通过更改插件两种方式实现,以及如何添加置顶显示.文章可能还有很多不足,请大家谅解,欢迎大佬提意见. 本文使用的东西 win10 ...

  8. 帖子置顶原理 php,自定义织梦cms文章置顶及其功能原理分析

    本人在织梦dedecms本发分类信息发布系统那个功能的时候,因为,用到置顶功能,这是很多分类信息系统最很重要的特色,所以,对这个作了一个织梦dedecms系统的研究,以前用织梦dedecms系统建站, ...

  9. [置顶]       webservice系列2---javabeanhandler

    摘要:本节主要介绍以下两点,1.带javabean的webservice的开发和调用 2.handler的简单介绍及使用 1.引言 在之前的一篇博客 webservice系列1---基于web工程上写 ...

最新文章

  1. alert文件位置 oracle,Oracle11gAlertlog文件位置的问题
  2. java hashmap扩容大小_HashMap的扩容机制以及默认大小为何是2次幂
  3. Greg and Array CodeForces - 296C(差分数组+线段树)
  4. ABP框架 v3.0 已发布!
  5. linux之如何复制文件夹所有文件到其它文件夹
  6. 计算机缺少fixos.dll,fix_toolbox.dll
  7. C语言关键字以及-格式输入输出中“%d,%o,%x,%e,%f”等的含义
  8. 计算机专业英语mooc,专业英语(软件)-中国大学mooc-题库零氪
  9. 管理感悟:再好的设计,不如能运行的原型
  10. 6场圆桌,20+演讲,48小时聚会, 2020全球区块链算力大会圆桌议题首度曝光
  11. 计算机应用总线带宽,带宽
  12. 图像坐标球面投影_坐标、投影及坐标转换
  13. 正则表达式过滤手机号
  14. python基础----Day06
  15. Springboot+mybatis
  16. 计算机图形学流体仿真mac网格,正交网格下不可压缩流体的图形学模拟
  17. linux signal
  18. 基于翻译的模型-TransE,TransH,TransR,TransD
  19. j2ee开发的各种技术
  20. caffe layer层详解

热门文章

  1. matlab三维图像分割,Matlab 沿三维任意方向切割CT图的仿真计算
  2. 农银e管家怎么显示服务器不对,农银e管家APP
  3. 内存(DRAM)芯片国产进程
  4. 计算机管理怎么分硬盘,电脑磁盘空间划分_电脑磁盘分区怎么分
  5. 五年工作经验总结 16 条的代码规范
  6. 几个简单好用的APP分享给你
  7. 制作Centos7模板机
  8. 基于ThinkPHP6+Layui后台开发框架
  9. 24c512 c语言程序,msp430读写24c512程序
  10. 错误 java.util.MissingResourceException: