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 做的两件事您可能不需要自己做:
- 它将
CompletableFuture
包装在一个代理中,该代理保留对您的 Executor
的引用,以便 运行 后续任务 也 执行者,而不是默认回到共同 ForkJoinPool
。 IMO 在 CompletableFuture
的设计中犯了一个重大错误。
- 它将同步执行 (
this::execute
) 包装在 blocking()
包装器中,这很方便地将逻辑包装在 ForkJoinPool.managedBlock()
中。当 运行ning 在 ForkJoinPool
中阻止工作时推荐这样做
我想在我的数据库中插入大量行。我看到 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 做的两件事您可能不需要自己做:
- 它将
CompletableFuture
包装在一个代理中,该代理保留对您的Executor
的引用,以便 运行 后续任务 也 执行者,而不是默认回到共同ForkJoinPool
。 IMO 在CompletableFuture
的设计中犯了一个重大错误。 - 它将同步执行 (
this::execute
) 包装在blocking()
包装器中,这很方便地将逻辑包装在ForkJoinPool.managedBlock()
中。当 运行ning 在ForkJoinPool
中阻止工作时推荐这样做