Jooq batchInsert()。execute()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jooq batchInsert()。execute()相关的知识,希望对你有一定的参考价值。

我的流程如下:

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

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

答案

这里重要的是不要一次性获取要处理的所有行。当使用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(...);
    }
}

以上是关于Jooq batchInsert()。execute()的主要内容,如果未能解决你的问题,请参考以下文章

带有 Logback 的 JOOQ

JOOQ 中的提交钩子

Java JOOQ 与 SQL Server:缓存查询

带有准备好的语句的 Java JOOQ

在executeInsert()之后的JOOQ,需要知道自动生成的ID

mybatis batchinsert