Java jOOQ异步批插入

Java jOOQ异步批插入,java,asynchronous,jooq,Java,Asynchronous,Jooq,我想在数据库中插入大量行。我已经看到jOOQ具有批处理支持,因此我可以执行以下操作: dslContext.batchInsert(myListOfRecords).execute() 然而,这是同义词。jOOQ还有许多其他异步API,是否有一个用于批量插入的API 如果不是,简单地将对execute的调用包装在CompletableFuture中是否安全?从jOOQ 3.12开始,这些executeAsync()方法确实在org.jOOQ.Batch类型中缺失。见: 然而,他们不做任何魔术。

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

dslContext.batchInsert(myListOfRecords).execute()
然而,这是同义词。jOOQ还有许多其他异步API,是否有一个用于批量插入的API


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

从jOOQ 3.12开始,这些
executeAsync()
方法确实在
org.jOOQ.Batch
类型中缺失。见:

然而,他们不做任何魔术。如果您查看
AbstractQuery.executeAsync(Executor)
的实现,这就是它所做的(从jOOQ 3.12开始):

@覆盖
公共最终完成阶段executeAsync(执行者执行者){
返回执行器ProviderCompletionStage.of(
CompletableFuture.supplyAsync(阻塞(this::execute),executor),()->executor
);
}
jOOQ做的两件事您可能不需要自己做:

  • 它将
    CompletableFuture
    封装在一个代理中,该代理保留对
    执行者的引用,以便在该执行者上运行后续任务,而不是默认返回公共
    ForkJoinPool
    。IMO在
    可完成未来的设计中犯了一个重大错误
  • 它将同步执行(
    this::execute
    )包装在
    blocking()
    包装器中,方便地将逻辑包装在
    ForkJoinPool.managedBlock()
    中。在
    ForkJoinPool
  • @Override
    public final CompletionStage<Integer> executeAsync(Executor executor) {
        return ExecutorProviderCompletionStage.of(
            CompletableFuture.supplyAsync(blocking(this::execute), executor), () -> executor
        );
    }