【问题标题】:subquery in spring batch item reader春季批处理项目阅读器中的子查询
【发布时间】:2021-04-05 11:56:00
【问题描述】:

假设我有一个人表。一个人可以拥有一到三个产品,它看起来像这样。

id  person_id  product  price
1   person1    product3   1
2   person1    product2   2
3   person1    product1   10
4   person2    product1   11
5   person2    product2   14

我应该获取每个人的所有产品,然后对其进行处理(映射到价格,执行一些逻辑),然后将计算数据写入最终表,该表仅包含两个字段(person_id 和 computed_value,其中 person_id 是键)

person_id  calculated_value
person1        100   
person2        111   
person3        93

在这种情况下实现项目阅读器的最佳方法是什么?(获取每个人的所有产品并进行处理) 是否可以在项目阅读器中的一个查询中完成,或者我应该在项目处理器中为每个人进行额外的查询?

【问题讨论】:

  • 计算是什么?
  • @GordonLinoff 这是一个简化的例子。假设我有每个价格的映射表,以及在每种情况下要做什么的公式。根据公式和映射表,我只能得到每个人的一个计算值。
  • 。 .我建议将它们作为表存储在数据库中并在数据库中进行计算。

标签: sql spring-batch spring-batch-tasklet


【解决方案1】:

这更像是一个设计问题,因此可能不适合 SO,但我会尽力提供帮助。通常,您应该针对步进处理器本身不检索数据而只进行处理。相反,读者应该收集所有数据并在读取数据时对数据执行映射,并呈现一个计算驱动的工作单元,然后可以对其进行处理并随后输出到任何需要的地方。

考虑到这一点...

是否可以在项目阅读器的一个查询中完成 ^-- 如果可以通过查询完成所有操作,那么您应该这样做。

此外,如果您需要基于查询响应数据的编程干预/查找/映射,那么您可以从编程部分和现有 Sql 读取器中创建一个复合读取器,以便您从 SQL 读取器中读取您需要的字段,并且然后将这些转换为以编程方式丰富的工作单元,然后传递给处理器进行工作。如果您需要将多行有效地组合成一个工作单元,请查看聚合项目阅读器方法。这是一个讨论该问题的 SO:spring batch aggregate records from db as one single record

...或者我应该在项目处理器中为每个人做额外的查询? ^-- 您应该避免在处理器中收集/查询更多数据。虽然您可以做得很好并且超级方便,但它不是每个框架获取更多数据的指定位置。最好将处理器设计为无状态引擎,并且所有收集都由读者负责。

【讨论】:

    【解决方案2】:

    面向块的处理模型不适合这种聚合。正如 Gordon Linoff 在 cmets 中所建议的那样,将这些数据存储在表中并让数据库进行计算会更容易、更有效。如果你真的想用 Spring Batch 来做,你可以分两步进行:

    • 步骤 1:一个 tasklet,它执行 select distinct(person_id) from table 以获取人员 ID 的不同值。此列表将传递到第二步。
    • 步骤 2:一个面向块的步骤,其中读取器迭代人员 ID,处理器执行附加查询以获取产品并进行计算。此步骤的编写者可以根据需要编写聚合值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-10
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多