【问题标题】:How does spring batch read in chunks? Does it maintain a cursor?Spring Batch 是如何分块读取的?它是否保持光标?
【发布时间】:2018-11-29 21:15:18
【问题描述】:

我想了解分块读取数据的底层机制。我实际上想手动复制该代码。 我们从中读取的数据库不支持 SQL 查询,这些查询可以限制读取的记录数。所以我想看看我是否可以以某种方式将读取限制为特定大小(就像弹簧批处理如何将一次读取限制为特定块大小一样)。

谢谢!

【问题讨论】:

  • 通常使用基于光标的阅读器。块是批处理级别的构造(不是数据库)。没有什么可以阻止您编写自己的 ItemReader 实现。在 Spring Batch 读取配置的项目数量后,块开始发挥作用。
  • @PavelHoral 感谢您的回复。我只是想看看 Spring Batch 块读取机制的幕后逻辑,以便我可以在我自己的不是 Spring Batch 应用程序的应用程序中实现它。

标签: java database spring jakarta-ee spring-batch


【解决方案1】:

Spring Batch 调用读取器,直到达到配置的块大小或数据源耗尽(即读取器返回null)。更具体地说,是ChunkProvider 要求读者提供一大块项目并将其交给ChunkProcessor。您可以在ChunkOrientedTasklet 类中找到代码的相关部分。

chunkOrientedProcessing 部分中的伪代码示例解释了块处理。

【讨论】:

  • 谢谢!假设读者查询是 select * from XYZ。 jdbccursoritemreader 是否知道 LIMIT/ROWNUM 或对查询应用任何限制并在第 1000 条记录处停止?我想看看幕后的逻辑,所以我可以在我自己的非批处理应用程序中实现它。
  • JdbcCusrorItemReader 在表上打开一个游标并且不限制行,除非设置了maxRows 参数。 I want to see that logic behind the scenes:建议你看一下类的代码:github.com/spring-projects/spring-batch/blob/master/…
  • @Julia 我感觉你漏掉了一点 - cursors 是数据库结构,不是 Spring Batch 也不是 JDBC 特定的。所以选择你最喜欢的数据库参考文档并检查游标的工作原理(例如postgresql.org/docs/9.2/plpgsql-cursors.html)。
猜你喜欢
  • 2012-12-07
  • 2023-03-25
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多