数据量太大,首先想到的办法就是分页执行,这一点oracle跟mysql不一样,mysql有limit语法,而oracle没有这个语法,oracle需要rownum并且需要别名嵌套才能实现limit的功能。
如果使用分页循环,设置环境变量,然后在转换中获取环境变量,这种情况下整个流程是在一个job里面,kettle是运行在jvm中的,通过观察jvm的垃圾回收情况,发现,kettle中并未有堆回收(但是觉着这是kettle的一个bug呢)。
因此,我们想到一条思路,如果让kettle能够自动进行垃圾回收,这个问题比较发散,思考过脚本定期干预jvm垃圾回收机制,还有一种也是通过我们大量的尝试工作,比如调整kettle的运行参数(无非就是配置文件的内存,这个有作用,但是还是无法从根本上解决问题,如果数据量无限扩大,内存总有极限值)
,调整队列大小,调整批处理个数等多种策略。
最终确定了将分页处理逻辑封装在一个job中,这样kettle的垃圾回收正好可以在每一个job中实现切换,自然实现了垃圾回收。这是一种思路,这块我总结:kettle的堆回收是在job切换的过程中进行了[非常重要]。
接下来,我们尝试如何让job内的变量获取到之后改变job外的环境变量,发现没有走通。之后我们进行了在一个job中的环境变量设置,js代码的获取及改变解决了这个问题。
最后打开jvm监控工具,发现了一条完美的直线,这样做,解决了kettle的垃圾回收,并且性能非常的稳定。
此处网上的答案非常少,分享出来,以后大家遇到这样的问题也好解决。