#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));