首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

八.Infosphere Data Replication-CDC UserExit实例

本文是该系列文章的第八章,也是最后一章。

1 概述

本文从实例出发,一步一步地演示User Exit的作成,配置和功能。两个实例,第一个是存储过程用户出口程序示例,实现了数据的软删除功能,即数据行从源表删除时,在目标表不会物理地删除该行,只是把其中某列值更新成删除标志值。第二个实例是Java用户出口程序,表/行级别的,实现了把源表的类型为CHAR(1)的某列,按BIT位转换为八个输出列,保存在目标表里。

2 存储过程用户出口(软删除)

本例是基于第三章介绍的“HelloWorld”实例加以说明的,即创建存储过程,在SUB1的CITY表到CITY表的mapping里配置该存储过程的User Exit。

根据上一章的学习,我们分三步说明,创建存储过程,在CDC里配置,实行和测试。

2.1 创建存储过程

CITY表有ID和NAME两个字段,创建如下存储过程,把NAME更新成删除标志值“DL”。

注意利用系统参数b$ID取得源表删除行的ID字段值,result和returnMsg是必须要有的输出。

存储过程源码如下:

create procedure SOFTDELETE (IN b$IDCHAR(4),OUT result int, OUT returnMsg CHAR(2) )

begin

update ADMINISTRATOR.CITY set NAME='DL'where ID=b$ID;

commit;

set result = 0;

set returnMsg = 'ok';

end

连接上targetdb,执行存储过程创建语句,在目标数据库创建好存储过程。

2.2 在CDC里配置存储过程

打开Management Console,打开Configuration里CITY表的mapping详细。

要实现软删除,首先要使CDC里的删除功能失效,打开Operation,把On Delete选项标记成Do Not Delete。

然后打开User Exits画面,选择Type为存储过程,指定Schema为ADMINISTRATOR,在Before Delete行输入存储过程的名字SOFTDELETE。记得保存。

2.3 实行和测试

以Continuous的方法StartMirroring SUB1,让SUB1处于Mirroring状态。

确认源表和目标表的数据状态:

源表和目标表里数据是一致的,都是两条数据。

从源表删除ID=1004的数据。

再次确认目标表的数据,ID=1004的数据NAME被更新成DL,实现了软删除。

3 Java用户出口实例

3.1 准备CDC环境

首先,在源数据库和目标数据库里,分别创建表BITTEST。

create table BITTEST (ID CHAR(4) NOT NULLPRIMARY KEY, NAME VARCHAR(20) NOT NULL, FLAG CHAR(1) NOT NULL)

目标表比源表多八个字段,对应转换后的字段。

create table BITTEST (ID CHAR(4) NOT NULLPRIMARY KEY, NAME VARCHAR(20) NOT NULL, FLAG CHAR(1) NOT NULL,

FLAG_B1 CHAR(1),

FLAG_B2 CHAR(1),

FLAG_B3 CHAR(1),

FLAG_B4 CHAR(1),

FLAG_B5 CHAR(1),

FLAG_B6 CHAR(1),

FLAG_B7 CHAR(1),

FLAG_B8 CHAR(1)

)

实行create语句,创建表。

登录进Management Console,创建SUB3,定义BITTEST到BITTEST的mapping如下:

3.1 Java实现源代码

Java实现比较简单,继承接口,重写三个方法,重点在processReplicationEvent方法,根据字段名取得FLAG字段的值,分别判断每个BIT的值,把结果或1设定回镜像对象。

/**

* This class is an user exit sample class fortransferring BIT to Char.

*

*@authorXiaoHe

*

*/

publicclassUserExitSampleimplementsUserExitIF {

// Define the events for subscribing

privatestaticfinalint[]eventsToSubscribe= {

ReplicationEventTypes.BEFORE_INSERT_EVENT,

ReplicationEventTypes.BEFORE_UPDATE_EVENT,

ReplicationEventTypes.BEFORE_REFRESH_EVENT};

/**

*initwhen start mirroring or start refresh

*

*@paramp_Publisher

*@throwsUserExitException

*/

@Override

publicvoidinit(ReplicationEventPublisherIFp_Publisher)throwsUserExitException {

try{

p_Publisher.unsubscribeEvent(ReplicationEventTypes.ALL_EVENTS);

for(inti= 0;i

p_Publisher.subscribeEvent(eventsToSubscribe[i]);

}

}catch(Exceptione) {

thrownewUserExitException(e.getMessage());

}

}

/**

* process every event defined atinit.

*

*@paramp_Event

*@exceptionUserExitException

*/

@Override

publicbooleanprocessReplicationEvent(ReplicationEventIFp_Event)throwsUserExitException {

try{

inteventType=p_Event.getEventType();

switch(eventType) {

caseReplicationEventTypes.BEFORE_REFRESH_EVENT:

caseReplicationEventTypes.BEFORE_UPDATE_EVENT:

caseReplicationEventTypes.BEFORE_INSERT_EVENT:

DataRecordIFimage=p_Event.getData();

if(image==null){

returntrue;

}else{

StringcolumnName="FLAG";

Stringvalue=image.getString("FLAG");

byte[]b=value.getBytes("ASCII");

intlen=b.length;

if(len== 1) {

intindex= 1;

for(inti= 1;i

if((b[0] & (byte)i) == 0) {

image.setString(columnName.concat("_B").concat(String.valueOf(index)),"0");

}else{

image.setString(columnName.concat("_B").concat(String.valueOf(index)),"1");

}

index+=1;

}

}

}

}

}catch(Exceptione) {

thrownewUserExitException(e.getMessage());

}

returntrue;

}

/**

*finsh() method is used to clearwork

*

*/

@Override

publicvoidfinish() {

}

}

3.2 配置编译后的class文件到CDC

进行这一步之前,需要stop 目标CDCengine。

编译上面的类,把class文件复制到下面的位置:

目标CDC安装路径\lib\com\user\sample\UserExitSample.class

复制完成后,重新启动目标CDC engine。

3.3 在CDC里设定Java用户出口

登录进MC,打开Configuration/UserExits,进行如下配置:

选定Type为Java Class。

3.4 实行和测试

在源表里,准备测试数据:

确认目标表是空表:

Start Mirroring SUB3,之后再次确认目标表的状态,Java用户出口确认生效了。

4 总结

到这里,IIDR-CDC的初级学习的系列文章,共八章,就全部说明完毕。

笔者在银行客户的项目里要求设计和实现一些Java UserExit功能,此前没有接触过IIDR-CDC,所以事前看了一些资料,再在CDC环境上检证,该系列文章就是总结了个人学习和检证的结果形成的,旨在帮助自己加深理解和掌握,如果能对没接触过IIDR-CDC的朋友有些许帮助,也是非常高兴的。能力有限,时间也短,难免有谬误,望指正。

最后,附上个人学习中的资料链接。

・IBM Knowledge Center IIDR V11.4用户手册

https://www.ibm.com/support/knowledgecenter/SSTRGZ_11.4.0/com.ibm.idr.frontend.doc/pv_welcome.html

・IBMdeveloperWorks

在IBM开发者社区里检索,可找到许多有用的资源。

https://www.ibm.com/developerworks/cn/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171213G0UHRW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券