【发布时间】: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