Jooq batchInsert()。execute()

问题描述 投票:0回答:1

我的流程如下:

  1. 选择一些数据每行选择50行,
  2. 做数据(设置一些值)
  3. 将行转换为另一个表的对象
  4. 调用batchInsert(myListOfRecords).execute()

我的问题是如何设置何时插入数据?在我当前的设置中,数据仅在循环结束时插入。这对我来说是一个问题,因为我想要处理比我在测试中更多的数据。因此,如果我同意这一点,那么我的进程将以异常结束(OutOfMemory)。我应该在哪里定义最大数量的数据来调用instert?

configuration jooq
1个回答
0
投票

这里重要的是不要一次性获取要处理的所有行。当使用jOOQ时,这是使用ResultQuery.fetchLazy()(可能与ResultQuery.fetchSize(int)一起)完成的。然后,您可以使用Cursor.fetchNext(50)获取接下来的50行,然后按如下方式继续插入:

try (Cursor<?> cursor = ctx
   .select(...)
   .from(...)
   .fetchSize(50)
   .fetchLazy()) {

    Result<?> batch;

    for (;;) {
        batch = cursor.fetchNext(50);

        if (batch.isEmpty())
            break;

        // Do your stuff here

        // Do your insertion here
        ctx.batchInsert(...);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.