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的功能,达到出奇制胜,意想不到的目的。
领取专属 10元无门槛券
私享最新 技术干货