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

七.Infosphere Data Replication-CDC UserExit介绍

1 概要介绍

用户出口程序(UserExit),其实就是应用程序提供的一种机制,这种机制能够支持用户扩展或者适应特定需求,通俗的讲,就是应用程序产品本身并不能直接实现某些特定需求,但是提供了一种机制,通常是用户用第三方编程语言写代码等,这些代码经过配置,能在应用程序里使用。

IIDR-CDC提供了接口规范,根据规范用户在指定的地方自定义操作,IIDR-CDC在复制数据过程中会执行这些操作,达到用户定制和扩展环境的目的。

2 用户出口程序分类

按照实现方式,IIDR-CDC提供了两种类型的用户出口:

第一种是存储过程,也可以说是符合IIDR规范的特定格式的存储过程,直接在数据库运行,速度比较快。

第二种是JAVA用户出口,IIDR-CDC提供了JAVA API和规范,用户做出符合要求的JAVA程序,编译后需要配置在IIDR-CDC的环境。

按照运行级别,用户出口也可以分为两类:

表和行级别的用户出口,可以是存储过程,也可以是Java程序。

Subscription级别的用户出口,只能是Java程序。

3 存储过程用户出口程序

存储过程用户出口,只能定义表和行级别的。

使用存储过程用户出口,通常分两步:创建存储过程,和在CDC里配置。

3.1 创建存储过程

第一步是在数据库端物理地定义存储过程,它既要符合特定数据库类型的书写规范,还需要满足IIDR-CDC的接口规范,CDC定义存储过程规范如下。

存储过程用户出口必须至少具有两个参数,这两个参数必须按照下列顺序首先进行定义:

result : 整数类型的输出参数,如果存储过程出口运行成功,将返回整数值”0”;如果存储过程用户出口不成功,将返回非零值。

returnMsg : 字符输出参数,如果存储过程用户出口运行不成功,会将错误消息返回至 CDC 事件日志。

在缺省情况下,存储过程的用户出口程序和 CDC replication 使用同一共享连接作为连接至数据库的连接。共享同一连接可以确保 CDC Replication 和存储过程用户出口程序的数据是一致的,相互可以访问的。

通过在存储过程中使用系统参数,可以取得源数据库中的数据。

取得系统值的系统参数都是以s$为前缀的,举例说明如下:

s$entry,数据类型是NUMBER,表示调用存储过程的入口点,值从1到10,分别对应Truncate,Insert,Update,Delete,Refresh的前和后共十个入口点。(入口点是在CDC里配置指定的,下一章实例说明)

s$srcTabId,数据类型是VARCHAR,表示源表的名称。

取得日志控制字段的系统参数是以j$为前缀的,距离说明如下:

j$USER,数据类型是VARCHAR,表示在源表进行操作的系统用户名。

取得数据值的系统参数是以b$, k$为前缀的,b$,取得源列的前镜像,k$取得目标表中待修改的行。

3.2 CDC里配置

在Configuration的User Exits区域,User Exit Type选择存储过程,下面指定Schema,右边根据入口指定存储过程名。

4 Java用户出口程序

IIDR-CDC安装完后,可以在安装位置找到JAVAAPI的东西。

ts.jar

Java API的jar包,在安装位置的lib文件夹下,配置Java环境,编译Java用户出口程序时会用到。

apidoc

在安装位置的docs文件夹下,html形式的javadoc,里面有API的主要接口和方法的说明。

samples.jar

IIDR-CDC也提供了许多Java用户出口的例子程序,放在安装位置的samples文件夹下,是.java格式的源文件。可以通过阅读这些例子程序,理解Java用户出口的机制,也可以基于这些范例编写自己的程序。

使用Java用户出口程序,主要分三步,首先基于API编写Java类并编译,其次把编译后的.class文件配置到CDC目标Engine,最后在CDCMC里配置设定。下面分别阐述一下这三步。

4.1 基于API编写Java用户出口并编译

开发环境,IIDR-CDC里JRE是1.8.0版本,所以开发Java程序时先下载JDK1.8.0并安装,之后下载eclipase,创建Java Project,把上面的ts.jar作为外部包引入到Java Project里,解压samples.jar,把解压后的所有java源文件复制到Java Project里,环境就这么简单。

然后打开api doc,我们熟悉一下Java用户出口的主要接口规范。

有两个很重要的IF,分别是UserExitIF和SubscriptionUserExitIF。

所有的行/表级别的UserExit 类,必须实现UserExitIF。

所有的Subscription级别的UserExit类,必须实现SubscriptionUserExitIF。

UserExitIF接口有三个方法,init()完成初始化,finish()用于结束前的清除和释放工作,processReplicationEvent()方法会被订阅的每种事件调用。SubscriptionUserExitIF接口也是类似的三个方法,只是方法参数类型不一样。

init()方法的参数类型是ReplicationEventPublisherIF,它包含许多方法,比如:

取得在MC里配置的参数:getParameter()

共享CDC的JDBC连接:getSharedConnection()

往IIDR-CDC的event-log添加写入日志:logEvent(java.lang.String message)

processReplicationEvent()方法的参数类型是ReplicationEventIF,它包含的方法例如:

得到即将Insert或者Update到目标表的镜像后数据:getData()

得到目标表的表名:getTableName()

4.2 配置编译后的class文件

编译后的class文件,保留包的层次结构,复制到目标CDC Engine安装位置的lib文件夹下。

4.3 在CDC的MC里配置

表/行级别的Java用户出口程序的配置位置:

和存储过程的用户出口配置位置相同,Type选择JavaClass即可。

Parameter输入字符串形式的参数,如果有多个参数,可以用分隔符隔开,在Java程序里再分割字符串。

右边的Event区域,包含Insert,Update,Delete,Truncate,Refresh五种操作,每种操作分Event前和Event后,根据业务需求选择好即可。

Subscription级别的Java用户出口程序的配置位置:

右键点击Sub名,选择User Exits,即弹出Subscription级别的Java用户出口的设置画面。因为它是交易级别的,只在commit后执行,所以只需指定类名和参数即可。

5 小结

IIDR-CDC的用户出口程序机制,提供了从CDCEngine取得不同信息的各种借口方法,在实际应用中灵活使用,可以完美地扩展IIDR-CDC的功能,达到出奇制胜,意想不到的目的。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券