kettle循环解决连接oracle数据库报错Connection reset

  • Post author:
  • Post category:其他



第二种循环源文件下载:

connection_reset.rar


介绍两种循环方式,一种是官方自带例子,通过job组件执行每一行来循环,第二种通过javaScript脚本组件循环,同时可以解决接oracle数据库报错Connection reset的问题


1.kettle8官方案例

文件位置:$KETTLE_HOME/samples/jobs/process all tables

这个例子是先获取数据库中的所有表名,统计表格表的数据条数,最后输出到txt上

包含文件和作用:

流程控制总job

transformation(转换):Get list of tables as result

组件1:get list of tables

自带数据库连接

组件2:Concat Fields

把TABLE_SCHEMA字段和TABLE_NAME拼接成一个字段TABLE_SCHEMA_NAME,分隔符为英文句号

组件3:tables.txt

查询出来的表名称TABLE_NAME输出到txt

输出的文件路径,可以把鼠标移动到上面就会显示

组件4:Select values

只选择一个字段TABLE_SCHEMA_NAME并且重命名成tablename

组件5:Copy rows to result

把表名称复制到结果集上,在下一个transformaton里面可以使用Get rows from result获取到结果集

Job(作业):Process a table

前面一个transformation获取到5条数据,数据到Process a table 这个job上需要勾选执行每一条数据,这点就是循环的关键

transformation(转换):Define TABLE variable

组件1:get one tablename

组件2:set ${TABLENAME}

transformation(转换):Get amount of rows from table

组件1:Number of rows in ${TABLENAME}

组件2:rows-${TABLENAME}.txt

查询到一个结果输出到一个txt上,文件名为${java.io.tmpdir}/rows-${TABLENAME}

输出结果为:

transformation(转换):save list of all result files

把输出的txt合并成一个,该例子有点问题需要修改一下才行,做循环的话这部分可以忽略


2.通过job step里的JavaSrcipt 组件构建循环

这个例子是自己写的,主要功能是连接oracle数据库时发生 ‘Connection reset by peer’ or ‘Connection reset’  的错误

作业如下:


其中js代码

var count;
var count_max;
//获取当前循环次数
count = parent_job.getVariable("EP_V_ID");
//获取允许的最大循环次数
count_max = parent_job.getVariable("EP_V_MAX_ID");

//当前次数等于最大循环次数
if(count == count_max){
    //返回false给js脚本组件,js脚本组件往红色线执行
    false;

}else{
    //当前循环次数加1
    count = parseInt(count) + 1;
    //替换jvm中的循环次数
    parent_job.setVariable("EP_V_ID", count);
    //返回true给js脚本组件,js脚本组件往绿色线执行
    true;

}

相当于如下循环:

for(int i=0;i++){

if(数据库连接成功)  break;

if(i==5) break;

print(“数据库连接信息”)

这种方式也可以循环便利数组,js中数组的使用方法具体的可以参考官网上的js脚本说明



版权声明:本文为guihui666666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。