Spring批处理读取XML的最佳体系结构

Spring批处理读取XML的最佳体系结构,spring,spring-boot,jaxb,spring-batch,Spring,Spring Boot,Jaxb,Spring Batch,在SpringBatch中读取XML的最佳性能体系结构是什么?每个XML的大小约为300 KB,我们正在处理100万个XML 我们目前的做法 30个分区和30个网格,每个从机获得166个XML 提交块100 应用程序启动内存为8GB 在读卡器默认Bean范围中使用JAXB 我们的问题: 这个结构正确吗 与JAXB相比,使用StatexEventItemReader和XStreamMarshaller在性能或体系结构上是否有任何优势。 如何正确处理内存以避免速度减慢 我将使用文件名作为作业参数,为

在SpringBatch中读取XML的最佳性能体系结构是什么?每个XML的大小约为300 KB,我们正在处理100万个XML

我们目前的做法 30个分区和30个网格,每个从机获得166个XML

提交块100

应用程序启动内存为8GB

在读卡器默认Bean范围中使用JAXB

我们的问题: 这个结构正确吗 与JAXB相比,使用StatexEventItemReader和XStreamMarshaller在性能或体系结构上是否有任何优势。 如何正确处理内存以避免速度减慢
我将使用文件名作为作业参数,为每个xml文件创建作业。这种方法有很多好处:

可重启性:如果作业失败,您只能从停止的位置重新启动失败的文件 可伸缩性:这种方法允许您并行运行多个作业。如果单台机器还不够,可以将负载分配到多台机器上 日志记录:日志在设计上是独立的,您不需要使用MDC或任何其他技术来分离日志
我们正在接收*.txt文件中的XML文件路径


您可以创建一个在这些行上迭代的脚本,并按行启动作业,即按文件启动作业。或者类似的工具是并行启动作业的好选择。

您是否考虑过为每个文件创建作业?从可重启性、性能、可伸缩性以及让一件事做好一件事的所有理由来看,这是IMO的最佳选择。每个txt文件平均有5000到10000个XML文件路径。每个txt文件正在创建一个作业和30个从属文件。从批处理作业执行中选择*,其中作业执行ID=13492;-根据txt文件,从批处理步骤执行中选择countSTEP\u EXECUTION\u ID,其中JOB\u EXECUTION\u ID=13492,步骤名称不在“masterStep”中,“moveFiles”;-31 slaves您是否可以建议,您是说在一个txt文件中创建一个每个*.txt文件的作业多个XML文件路径,每个从属分区将处理一个XML。在本例中,批处理步骤执行有大量记录,因为我们有500万个XML。如果有帮助,请接受:。谢谢你,马哈茂德。我将验证性能并确认返回。我们只有一台服务器,但功能非常强大,拥有96个CPU和350GB RAM。我们有近500万个XML,这种方法在批处理和步骤执行中创建了500万条记录。我们需要检查上述计数的增加对数据库IO的影响。这不是服务器,而是野兽:-尝试根据输入文件大小、项目大小、块大小等平均对每个作业所需的资源进行预分析,并相应地设置JVM内存参数。这样,您的服务器就可以毫无问题地处理所有工作负载。现在,使用本地分区逐个处理来自文件的发票。我们的性能已更改为每小时150万次插入多个表。再次感谢你真正的支持。
@StepScope
@Qualifier("xmlItemReader")
public IteratorItemReader<BaseDTO> xmlItemReader(
        @Value("#{stepExecutionContext['fileName']}") List<String> fileNameList) throws Exception {
    String readingFile = "File Not Found";
    logger.info("----StaxEventItemReader----fileName--->" + fileNameList.toString());
    List<BaseDTO> fileList = new ArrayList<BaseDTO>();
    for (String filePath : fileNameList) {
        try {
            readingFile = filePath.trim();
            Invoice bill = (Invoice) getUnMarshaller().unmarshal(new File(filePath));
            UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO(bill, environment);
            unifiedDTO.setFileName(filePath);
            BaseDTO baseDTO = new BaseDTO();
            baseDTO.setUnifiedDTO(unifiedDTO);
            fileList.add(baseDTO);
        } catch (Exception e) {
            UnifiedInvoiceDTO unifiedDTO = new UnifiedInvoiceDTO();
            unifiedDTO.setFileName(readingFile);
            unifiedDTO.setErrorMessage(e);
            BaseDTO baseDTO = new BaseDTO();
            baseDTO.setUnifiedDTO(unifiedDTO);
            fileList.add(baseDTO);
        }
    }
    return new IteratorItemReader<>(fileList);
}