数据从一个系统到另一个系统的批量传输是许多企业应用程序中的常见功能。但是,它们通常效率低下。首先,源系统运行批处理作业,生成(通常较大的)更新文件。一段时间后,另一个作业查找此文件并将其上传到目标系统,通常是通过FTP或类似的东西。最后,远程系统上的第三个作业查找上载的文件并导入它(假设它可用)。
这种过程很慢且容易出错。目标系统必须等到前两个进程(生成导出文件和上传)完成后才能启动。由于第二步和第三步是时间相关的,如果意外情况导致任何先前任务延迟运行,就会导致失败。
更好的选择是并行执行这些操作。通过流式传输源系统生成的输出,目标系统可以在生成时使用它,从而消除了冗余且耗时的复制步骤。
导出示例
例如,以下代码模拟导出CSV文档的批处理。它使用开源HTTP-RPC框架中的 WebServiceProxy 和CSVEncoder 类将模拟数据上载到RESTful Web服务。传递给编码器构造函数的字符串值表示输出文件中的列:
数据由以下类提供,该类只生成任意数量的重复行。在实际应用程序中,数据很可能来自关系数据库或类似的东西:
生成的文档看起来像这样:
导入服务
用于处理已导出的数据的Web服务可能如下所示。该方法不是将整个有效负载预先读入内存,而是使用HTTP-RPC的 CSVDecoder 类来获取CSV文档中的行。在读取每条记录时,它将被插入到数据库中:
批量更新
即使该服务有效地处理了客户端提供的数据,它也非常慢。仅导入500条记录需要将近30秒!解决方案是批量插入记录,如下所示:
此方法与前一版本几乎相同。但是,不是为每一行执行数据库更新,而是每25,000行对更新进行批处理并执行一次。该服务现在可以在大约30秒内处理500,000行 - 比之前的版本快1000倍!
总结
数据传送是许多企业系统中的常见元素,并且通常比较低效。但是,通过流式导入和使用批量更新,可以显着提高性能。