1. 接口需求概述
1.1 部门业务系统调用以下形式Web Service接口,将数据推送到数据云。通过接口,可以实现数据记录的新增、修改、删除。
原型接口:
public string pushXml(string guid, string catalogid , string xmlstr);
参数说明:
guid是用户身份验证接口返回的验证字符串
catalogid是提供的目录标识
xmlstr 是要推送的xml格式数据
限制条件:该接口每次推送的数据row节点(记录数)不超过500个;如果需要推送超过500条记录,请多次调用接口。
2. 转换处理
2.1 读取500条参数,与一条guid、catalogid封装成想xml请求参数
2.2 其中的字符串替换是因为涉及添加了逻辑主键,而webservice接口中对xml格式有校验,不能携带多余的逻辑主键。而在更新时又需要用到逻辑主键,获取逻辑主键的参数来自于封装xmlstr步骤。 顾虑:此时500个逻辑主键与500条实体数据分离,考虑调用接口时这500条数据是同时失败或成功的,以此逻辑主键去修改库中上传状态应当不存在问题。
3. 问题
接口一次只能执行500条数据,而库中已经存在数百万余量需要上传,以及运行期间会有新增的增量。
3.1 在获取数据表中未上传的500条数据时,判断条件为where state=0。会导致每次添加数据时会遍历全表,而且state不会设置索引。虽然服务器处理能力强大,但是否可以有优化途径。学习kettle一个礼拜,很多功能还不清楚,需要去分析数据库检索策略,还有kettle 的多线程也需要去学习,可能有好的办法。
3.2 目前已在运行的服务中,其他人在处理余量数据时,采用作业定时调度重复执行,直到余量数据上传完毕,后续人为调整为10分钟执行以处理增量数据(增量数据来自全省人员体检数据,预估每年千万级上限)。
个人思路同样执行10分钟定时任务,如果有余量数据,则自动循环执行转换,直到上传完毕。这样部署之后就不用再调整了,设想很美好,但是写不出o(╯□╰)o