项目背景
最近遇到一个棘手的问题,就是数据批量更新问题,批量更新信息类型2010,数据10W+,HR_INFOTYPE_OPERATION执行时间大约需要5小时+而且还丢失数据,数据无法导入系统,项目存在延期风险。
初步思路
记得十几年前在国网遇到一个问题,就是导入数据会有覆盖,后来发现是因为buffer问题,所以记得在写信息类型之前每次都调用一次清理buffer的操作,HR_PSBUFFER_INITIALIZE,还有一个note忘记号码,里面说增加清理buffer函数可以提升效率
第一次失败
满怀希望的开始,最后被现实洗礼,失败,提升效率微乎其微,5小时估计也最多提升到4.8小时>>>>>>>>>>>>>>>>>>>>>>>>,这时候回想18年能源项目导入0007很慢,数据才3万条。正当百思不得其解的时候,ECP-PTP遇到一个问题,关于主数据同步的一个BUG,和SAPdebug几天,找到BUG原因,SuccessFactor主数据同步到ECP,数据也有好几千人,而且涉及到过个信息类型,SAP也就十来分钟。采取的就是异步机制,同时开启多个线程。
思维联想
下图是successfactor主数据同步到SAP的同步逻辑,TCODE:SRTUTIL能监控每次数据传输的记录,而且是拆包分批传输,所以SAP的框架是支持多线程存储的,所以就要把HR_INFOTYPE_OPERATION程序拆分成多个包并行,不能提升效率。
新思路
Parallel Processing Technique in SAP using SPTA框架
原理很简单,同时能启动多个线程并行跑,但是ECP有个和其他模块区别的是,每次编辑员工需要加锁,所以并行跑的时候,要把一个人的数据放入到一个包,以防同一个人进入两个不同的包,相互锁的问题。
核心就是这个方法SPTA_PARA_PROCESS_START_2,启动线程
然后有三个回调方法F_BEFORE_RFC,F_IN_RFC,F_AFTER_RFC
F_BEFORE_RFC方法是主数据收集分发器,比如我有100条数据,10条一个包,分发一次我就要删除10条。
F_IN_RFC方法是业务逻辑处理层,HR_INFOTYPE_OPERATION函数就在这实现。
F_AFTER_RFC方法是处理返回信息及结果。
F_BEFORE_RFC逻辑
F_IN_RFC逻辑
F_AFTER_RFC
因为时间比较赶,代码比较乱,只是完成功能。
开始15个线程,大约13分钟,如果开启20个线程大约10分钟。