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

dslContext.batchInsert(myListOfRecords).execute()


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

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

最佳答案

从jOOQ 3.12开始,这些executeAsync()方法确实在org.jooq.Batch类型上缺失。参见: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可以做两件事,您可能不需要自己做:


它将CompletableFuture包装在保留对Executor的引用的代理中,以便也可以在该执行程序上运行后续任务,而不是默认返回公用ForkJoinPool。 IMO是CompletableFuture设计中的重大错误。
它将同步执行(this::execute)包装在blocking()包装器中,该包装器方便地将逻辑包装在ForkJoinPool.managedBlock()中。在ForkJoinPool中运行阻止工作时建议这样做

09-04 07:45
查看更多