java—如何在spring批处理中分块处理select查询的结果

fwzugrvs  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(400)

要求:
select查询可能会产生20万条记录。我们需要获取记录,对其进行处理,并将其与处理后的结果一起写入数据库。
使用的数据库:nuodb
问题:
我阅读了nuodb文档:
对事务引擎的查询结果将以小于100KB的行缓冲回客户端。一旦客户机遍历一组获取的结果,它将返回te以获得更多的结果。
我不确定数据库引擎是否能一次返回20万条记录。我还觉得在一个列表变量中保存20万条记录并不理想。select查询在where子句中有日期字段,如:

SELECT * FROM Table WHERE DATE >= '2020-06-04 00:00:00' AND DATE < '2020-06-04 23:00:00'

上述查询可能会产生20万条记录。
我想把问题分成:

SELECT * FROM Table WHERE DATE >= '2020-06-04 00:00:00' AND DATE < '2020-06-04 10:00:00'
SELECT * FROM Table WHERE DATE >= '2020-06-04 10:00:01' AND DATE < '2020-06-04 18:00:00'
SELECT * FROM Table WHERE DATE >= '2020-06-04 18:00:01' AND DATE < '2020-06-04 23:00:00'

但我不确定这种方法是否理想。请给我建议。
因此,请考虑3个类a、b、c,它们分别扩展了itemreader、itemprocessor和itemwriter。

.get("stepToReadDataFromTable")
        .<Entity1, Entity2>chunk(2000)        
        .reader(A()) 
        .processor(B())
        .writer(C())
        .build();

我们可以这样做吗:类a将从200k条记录中提取2000条记录并对其进行处理,然后在处理完2000条记录(如区块中所述)后将其写入数据库。此循环将一直进行,直到处理完所有20万条记录。
如果是,我们如何才能做到这一点。有没有办法从select查询中分块提取数据?

vx6bjr1n

vx6bjr1n1#

您可以使用分页项读取器来读取页中的项,而不是将整个数据集加载到内存中。
这将在参考文档的面向块的处理部分进行解释。
这似乎与select查询能否在spring批处理中检索200k条记录有关。

相关问题