multithreading - 使用多个线程执行 Spring Batch 进程阶段

标签 multithreading spring-batch

我正在使用 Spring Batch 从 Wikipedia XML 转储文件(一个 30 多个 gig 文件)中提取一些数据。我正在使用 StaxEventItemReader读入标签,然后对每个页面进行一些分析。完成每个条目的分析后,我会将结果数据注入(inject)数据库。这是一个非常简单的 Spring Batch 工作流程:

read->process->write

我希望处理阶段是多线程的,因为它是独立的、处理器密集型的,并且写入阶段不依赖于顺序。
     /process\
read<-process->write
     \process/

我已阅读 this问题,其中最重要的答案是阶段之间的数据存储在 JobRepository并表示不建议在此处存储大量数据。

我在 Spring Batch 发行版中看到了“并行”示例,但这会并行处理整个第二个“加载”步骤(即读取器、处理器和写入器),而不仅仅是并行运行处理。

是否可以说进程阶段应该在特定大小的线程池中处理?我的工作流程是否适合 Spring Batch,还是将其重写为普通的 J2SE 程序更好?

最佳答案

您的阅读器必须是线程安全的。
如果这不可能,我建议您使用暂存区:

  • 第一步:分析您的数据并将它们以方便的格式存储在某处。
  • 完成后,开始第二步:使用多线程、sql 批处理和我们在 Java 中拥有的所有东西来插入数据以提高性能。

  • 也许 NoSQL 数据库可能是存储暂存数据的好选择。

    关于multithreading - 使用多个线程执行 Spring Batch 进程阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9516362/

    相关文章:

    ruby - 如何阻止主线程退出?

    java - 单元测试中 Spring Batch JobRepository 的事务问题

    java - 如何在保持线程安全的同时降低锁定粒度?

    spring-boot - Spring Batch Java Config JobLauncherTestUtils

    java - Spring - FlatFileItemReader 与 FixedLengthTokenizer 的结合使用

    java - Spring Batch : How to pass data from StepExecution to JobExecution without persisting it (that is, 不使用 ExecutionContext)?

    java - block 大小为 n 的 Spring Batch 作业仅写入第 n 行 n 次

    asp.net - 为 ASP.NET 中的第一个访问者设置缓存对象

    apache-flex - Actionscript PNGEncoder 性能和 UI 阻塞

    android - ListView 不刷新已经可见的项目