jOOQ асинхронная пакетная вставка - PullRequest
1 голос
/ 06 февраля 2020

Я хочу вставить большое количество строк в мою базу данных. Я видел, что у jOOQ есть пакетная поддержка, поэтому я могу сделать следующее:

dslContext.batchInsert(myListOfRecords).execute()

Однако это синоним. У jOOQ есть много других асинхронных API, есть ли один для пакетных вставок?

Если нет, безопасно ли просто обернуть вызов в execute в CompletableFuture?

1 Ответ

1 голос
/ 07 февраля 2020

Начиная с jOOQ 3.12, эти executeAsync() методы действительно отсутствуют в типе org.jooq.Batch. См .: https://github.com/jOOQ/jOOQ/issues/9806

Однако они ничего не делают маги c. Если вы посмотрите на реализацию 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(), которая удобно упаковывает лог c в ForkJoinPool.managedBlock(). Рекомендуется при выполнении работ по блокировке в ForkJoinPool
...