3

我正在研究 Javaee Batch API (jsr-352),以测试使用该技术为我们自己的解决方案更改当前 ETL 工具的可行性。

我的目标是建立一个工作,我:

  • 在步骤 1 从数据源获取一些(虚拟)数据,
  • 步骤2中来自其他数据源的一些其他数据和
  • 在步骤 3 中合并它们。

我想处理每个项目而不是写入文件,而是将其发送到下一步。并且还存储信息以供进一步使用。我可以使用 batchlets 和jobContext.setTransientUserData().

我认为我没有正确理解这些概念:据我了解,JSR-352 是针对这种 ETL 任务的,但它有两种类型的步骤:块和批处理。块是“三阶段步骤”,其中一个读取、处理和写入数据。批处理任务不是对数据上的每个项目执行一次,而是一次(如计算总数、发送电子邮件等)。

我的问题是,如果我考虑批处理的定义,我的解决方案是不正确的。

一个人如何使用 Javaee Batch API 来实现这个 kinf od 工作?

4

1 回答 1

5

我认为您最好使用块而不是批处理来实现 ETL。使用数据源的典型块处理如下所示:

  • ItemReader#open(): 打开一个游标(创建Connection和)Statement并将ResultSet它们保存为 的实例变量ItemReader
  • ItemReader#readItem(): 创建并返回一个包含行数据的对象ResultSet
  • ItemReader#close(): 关闭 JDBC 资源
  • ItemProcessor#processItem():进行计算并创建并返回一个包含结果的对象
  • ItemWriter#writeItems():将计算的数据保存到数据库。open ConnectionStatement并调用executeUpdate()和关闭它们。

至于您的情况,我认为您必须选择一个相当重要的数据作为主要数据,并在ItemReader#open(). ItemProcessor#processItem()然后为每个项目获取另一个。

我还建议您阅读有用的块处理示例:

我关于 JBatch 和块处理的博客文章:

于 2015-05-26T08:44:02.920 回答