Рекомендуемый способ выполнения длительных запросов

#java #jooq

Вопрос:

Каков рекомендуемый способ выполнения длительных запросов в jOOQ?

Есть ли какие-либо недостатки в асинхронном выполнении запроса(кроме операции блокировки ForkJoinPool , которую можно было бы смягчить, передав выполнение в выделенный пул потоков), преобразовании результата в CompletableFuture метод и вызове get() метода с указанным временем ожидания?

 dslFactory
    .create()
    .selectFrom(TABLE_NAME)
    .where(conditions)
    .fetchAsync()
    .toCompletableFuture().get(10, TimeUnit.SECONDS);
 

Ответ №1:

Как вы уже отмечали, при выполнении запросов jOOQ поверх JDBC (синхронизация или асинхронность, не имеет значения) вы где-то заблокируетесь, и вам придется как-то управлять этими ресурсами. Во многих случаях это не является большой проблемой.

Если блокировка окажется проблемой, jOOQ 3.15 начнет поддерживать R2DBC, который позволяет выполнять ваш запрос реактивно, без блокировки в клиенте: https://blog.jooq.org/2021/07/15/reactive-sql-with-jooq-3-15-and-r2dbc

Тогда ваш запрос будет выглядеть следующим образом:

 Flux<TableNameRecord> result = Flux.from(
    dslFactory
        .create()
        .selectFrom(TABLE_NAME)
        .where(conditions));