Java jOOQ异步批插入
我想在数据库中插入大量行。我已经看到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类型中缺失。见: 然而,他们不做任何魔术。
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
);
}