【问题标题】:How to handle the result of SELECT query in chunks in Spring Batch如何在 Spring Batch 中分块处理 SELECT 查询的结果
【发布时间】:2020-06-04 18:28:09
【问题描述】:

要求:

一个 SELECT 查询可能会产生 200K 条记录。我们需要获取记录,对其进行处理并将其与处理结果一起写入数据库。

使用的数据库:NuoDB

问题:

我已阅读 NuoDB 文档:

对事务引擎的查询结果将被缓冲回 小于 100 KB 的行中的客户端。一旦客户 遍历一组获取的结果,它将返回到 TE 获得更多结果。

我不确定数据库的引擎是否可以一次返回 20 万条记录。而且我也觉得在 List 变量中保存 200K 记录并不理想。 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'

但我不确定这种方法是否理想。请指教。

所以请考虑分别扩展 ItemReader、ItemProcessor 和 ItemWriter 的 3 个类 A、B、C。

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

我们可以这样做吗: A 类将从 200K 记录中提取 2000 条记录并对其进行处理 在处理 2000 条记录(如块中所述)后将其写入数据库。 此循环将一直持续到处理完所有 200K 记录为止。

如果是,我们如何才能做到这一点。有什么方法可以分块从选择查询中提取数据?

【问题讨论】:

  • 你最后的代码 sn-p 是要走的路。 Spring Batch 正是用于处理此类用例。给它整个查询(不需要拆分它)并像你一样定义块大小。如果您希望一次提交 2000 条记录,则必须相应地定义提交间隔。还可以使用分页项目阅读器并指定与间隔提交匹配的页面大小。

标签: java sql spring-batch nuodb


【解决方案1】:

您可以使用paging item reader 读取页面中的项目,而不是将整个数据集加载到内存中。

参考文档的chunk-oriented processing 部分对此进行了说明。

这似乎与Will the SELECT Query be able to retrieve 200K records in Spring Batch有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2014-06-05
    相关资源
    最近更新 更多