jOOQ 异步批量插入

jOOQ asynchronous batch insert

我想在我的数据库中插入大量行。我看到 jOOQ 有批处理支持,所以我可以执行以下操作:

dslContext.batchInsert(myListOfRecords).execute()

不过,这是同义词。 jOOQ 还有许多其他异步 API,是否有用于批量插入的 API?

如果不是,将对 execute 的调用简单地包装在 CompletableFuture 中是否安全?

从 jOOQ 3.12 开始,org.jooq.Batch 类型确实缺少这些 executeAsync() 方法。参见:https://github.com/jOOQ/jOOQ/issues/9806

然而,他们并没有施展魔法。如果你看一下 AbstractQuery.executeAsync(Executor) 的实现,这就是它正在做的(从 jOOQ 3.12 开始):

@Override
public final CompletionStage<Integer> executeAsync(Executor executor) {
    return ExecutorProviderCompletionStage.of(
        CompletableFuture.supplyAsync(blocking(this::execute), executor), () -> executor
    );
}

jOOQ 做的两件事您可能不需要自己做:

  1. 它将 CompletableFuture 包装在一个代理中,该代理保留对您的 Executor 的引用,以便 运行 后续任务 执行者,而不是默认回到共同 ForkJoinPool。 IMO 在 CompletableFuture 的设计中犯了一个重大错误。
  2. 它将同步执行 (this::execute) 包装在 blocking() 包装器中,这很方便地将逻辑包装在 ForkJoinPool.managedBlock() 中。当 运行ning 在 ForkJoinPool
  3. 中阻止工作时推荐这样做