我正在尝试实现一个Spring批处理作业,为了处理记录,它需要2-3个db调用,这会减慢记录的处理速度(大小为100万)。如果我使用基于块的处理,它会单独处理每条记录,性能会很慢。因此,我需要一次性处理1000条记录,作为批量处理,这将减少数据库调用,并提高性能。但我的问题是,如果我实现Tasklet,那么我也会失去可重启性和重试/跳过功能,如果使用AggregateInputReader实现,我不确定对可重启性和事务处理会有什么影响。如下所示,线程聚合阅读器应该可以工作,但不能确定它在发生故障时对事务处理和可重启性的影响:
Spring批处理:一次处理多条记录
面向块的处理模型中的第一个扩展点是ItemWriteListener#beforeWrite(list items)
,它允许您访问要写入的项列表。因此,如果不想在项目处理器
中一次丰富一个项目,可以使用该侦听器一次对整个区块进行丰富。
我在表中总共有8条记录,其中6条在spring批处理调用read时可以使用jpareader。现在我将页面大小和块大小设置为1以进行测试。期望作业运行时,它应该进行6次读取调用,然后它应该逐个处理,逐个写入。但实际上发生的是,它只是调用read 4次(从日志中我可以看到这样读取页面0...1)并处理4个,其中一个由于不匹配写入标准而被过滤掉,然后它只是更新了3个记录,作业标记为成功完成。
我正在建立一个多模块的项目与Spring引导和批处理。 当前的目录结构为: 核心 网站 批处理 核心包含领域对象、存储库、服务。 web和批处理各自有自己的上下文,并用注释,我在执行时使用属性进行配置,例如 问题出现在包含核心类时,由于缺少存储库的bean定义,两个应用程序都不会启动,所以听起来组件扫描对核心模块不起作用。 我已经尝试了和),但没有成功。 有什么想法,我错过了什么,或者有没有更好的
我们使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们处理为“块”,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方,不能为每个项目调用服务。 我看到我们可以为“块”中涉及的所有读取器-处理器-写入器创建包装器,以处理列表<>并委托给一些具体的读取器/处理器/写入器。但这对我来说并不是件好事。像这样:
我正在处理包含数据库中多个记录列表的。 我应该如何指定处理每个子列表的块大小? 感谢您的帮助,提前谢谢。
步骤1:从数据库中加载10条记录。(Tasklet负责该工作) 步骤2:使用提交间隔=1的ItemReader、ItemProcessor、ItemWriter实现配置了面向块的处理 据我所知,对于每一个记录 > 我的问题是假设它处理了六条记录,而现在在ItemProcessor实现中的第7条记录出现了异常,它尝试回滚,但由于事务处于未知状态而无法回滚 即使它不能回滚第7条记录的tx,它也不会处理
我正在学习spring batch,并试图理解在异常期间项目处理器是如何工作的。 我试图通过在我的项目处理器中为一条记录手动抛出异常来模拟异常 现在根据跳过限制,当异常被抛出时,项目处理器将重新处理块并跳过抛出错误的项目,项目写入也将所有记录插入数据库,除了一条异常记录。 这一切都很好,因为我的处理器,它只是转换为大写字母名称,它可以运行很多次,但影响很大。 其他的选择是什么?