最佳实践

任务编排

js 中如果需要查询目标数据,在基于该目标数据做判断。

例如:按时间点:E0, E1, E2 E1 处理后,处理E2,期待目标是 E1,但实际E1还没到目标,目标的结果还是E0 解决方案:需要打开任务的串行模式设置

同一 dataflow 中,只能使用同一个 Connection的 一张表一次

解决方案:若要使用2次,需要创建2个数据源

JS 时间比对

添加 new Date().getTime() == new Date().getTime() ,结果为 true,但是通过record 拿到的 date 类型,用getTime() 比对,结果为 false

解决方案:

var Long = Java.type(""java.lang.Long"");
var cmp = Long.compare(txns[0].transactionDate.getTime(), txns[1].transactionDate.getTime())cmp == 0

JS 删除 record 的一个字段

删除record 属性,不能用 js 语法:delete record.xxx

解决方案:要用 record.remove('xxx')

JS 不支持箭头函数

解决方案:要用 function()

JS 命名不能用 obj = null,会变成全局变量

解决方案:var obj = null

改名后,切换浏览器窗口,会失效

解决方案:需要点击一下其他地方,保证光标移出修改字段框,字体变红色

数据节点的 filter 只针对初始化

解决方案:cdc 如果也需要过滤,就要加js if (context.syncType == 'cdc')

关系型数据库的 filter,需要指定 schem,否则会用默认 owner 的库

解决方案:select * from sys_iv.iv_invnt_index

cache节点默认加载全部字段,占用内存多

解决方案:源端表用 proiection 保留只用的字段,节省内存

若PK 值会发生变化,match and merge 时,第二次启动时,若目标已有数据,会报唯一性约束

解决方案:创建连接时,需要勾选“支持修改PK”match and merge ,目标需要有一张查询表:

CREATE TABLE [schema].""
_TAPD8_JOB_ID VARCHAR2(50),
SCN NUMBER NOT NULL,
RSID VARCHAR2(50) NOT NULL)

注意:用 match and merge or insert only 不需要查询表也可以工作。

启动任务并不会保存任务设置

解决方案:需要点击保存按钮,在开启任务

Oracle 时区

解决方案:创建关系型数据库连接时,需要设置时区,默认根据数据库时区,且只对源端关系型数据库有效

当源端连接是Oracle, MSSQL, MySQL, PG, Sybase, DB2 作为源端时,可以获取完整删除数据样本。MongoDB 作为数据源时,只能获取_id