Spring Batch:Reader问题:用于形成域对象的多个输入查询

时间:2013-12-24 10:31:28

标签: java spring-batch

我有一个读取器查询,它从数据库中获取产品ID。

我的域对象也包含多个列表。

我的提交次数为1000次。

因此,我的sql一次获取1000个项目(即1000个产品ID)。

但是,在我的rowmapper中,我为块中提取的每个Product Id运行了10个其他查询。这些查询返回了许多行作为结果集。我解析这些结果集来设置我的域对象中的列表。

这是创建一个完整域对象的方式,然后我将其传递给编写器,以便使用合适的映射器写入XML。

但是,由于rowmapper中的这些查询针对每次记录提取运行,因此我的整体程序性能受到严重影响。

我无法将这些查询与主读者查询相结合。

对于提高性能的这种要求,有没有解决方案?我有什么方法可以对rowmapper中运行的查询进行一些并行处理,以减少处理时间?

感谢阅读!

1 个答案:

答案 0 :(得分:1)

针对您的具体问题:

  1. 是否有针对此类要求提高性能的解决方案 - 是的。根据您的特定用例(数据库设计,任何可缓存的查询等),可能有许多解决方案。
  2. 我有任何方法可以对在rowmapper中运行的查询进行一些并行处理以减少处理时间 - 有了这个,我不得不问是否有能力让读者只返回填充了id的域对象,并让ItemProcessor执行其余查询。我问,因为有一个名为Spring Batch Integration(https://github.com/spring-projects/spring-batch-admin/tree/master/spring-batch-integration)的项目提供了一个AsyncItemProcessor。您可以使用它来并行处理每个项目(执行查找),然后相应的AsyncItemWriter会在查找完成后写出结果。这将是实现并行化此类逻辑的最快捷,最简单的方法。
  3. 存在用于并行化此类场景的其他选项,但请记住,运行许多小查询会打败您的数据库。并行运行它们只会加剧这个问题。您可能需要重新考虑这些子查询的结构。