gsn*_*dev 14 spring jdbc batch-processing spring-batch
使用案例:从数据库中读取1000万行[10列]并写入文件(csv格式).
将建议JdbcCursorItemReader和JdbcPagingItemReader中的哪个ItemReader实现?那是什么原因?
在上述用例中哪个表现更好(快)?
在单流程与多流程方法的情况下,选择会有所不同吗?
在使用TaskExecutor的多线程方法的情况下,哪一个会更好和简单?
要处理这种数据,如果可能的话,你可能想要并行化它(如果输出文件需要保留输入的顺序,那么唯一阻止它的是).假设您要对您的处理进行并行化,那么您可以为此类用例提供两个主要选项(根据您提供的内容):
我与Spring Batch并行处理数据.具体来说,我提供的示例是远程分区作业.您可以在此处查看:https://www.youtube.com/watch?v = CYTj5YT7CZU
针对您的具体问题:
我将从基本步骤定义开始.然后尝试多线程步骤.如果这不符合您的需求,则转到本地分区,最后根据需要进行远程分区.请记住,Spring Batch旨在使这种进展尽可能轻松.只需配置更新,您就可以从常规步骤转到多线程步骤.要进行分区,您需要添加一个新类(Partitioner实现)和一些配置更新.
最后一点说明.其中大部分讨论了并行处理这些数据.Spring Batch的FlatFileItemWriter 不是线程安全的.您最好的选择是并行写入多个文件,然后如果速度是您的头号问题则将它们聚合在一起.
您应该对此进行分析以便做出选择.在简单的JDBC中,我会从以下内容开始:
ResultSet.TYPE_FORWARD_ONLY和准备陈述ResultSet.CONCUR_READ_ONLY.除非您使用这两个游标,否则几个JDBC驱动程序会"模拟"客户端中的游标,而对于大型结果集,您不希望这样,因为它可能会引导您,OutOfMemoryError因为您的JDBC驱动程序正在缓冲内存中的整个数据集.通过使用这些选项,您可以增加获得服务器端游标的机会,并将结果"流式传输"到您的位置,这就是您想要的大型结果集.请注意,某些JDBC驱动程序始终在客户端"模拟"游标,因此此提示可能对您的特定DBMS无用.JdbcCursorItemReader似乎涵盖了这两个方面,但正如之前所说的那样,并不能保证在所有DBMS中都能提供最佳性能,所以我会从那开始,然后,如果性能不足,请尝试JdbcPagingItemReader.
JdbcCursorItemReader除非您有非常严格的性能要求,否则我认为对您的数据集大小进行简单处理并不会很慢.如果你真的需要并行化使用JdbcPagingItemReader 可能会更容易,但这两者的界面非常相似,所以我不会指望它.
无论如何,个人资料.
| 归档时间: |
|
| 查看次数: |
10858 次 |
| 最近记录: |