Получение ОШИБКИ Соединение не открывается ЗАКРЫТО при составлении Фьючерса с использованием vertx-jooq-classi c -reactive: 5.0.1 - PullRequest
1 голос
/ 27 апреля 2020

У меня проблема при составлении нескольких фьючерсов для выполнения обновления Книги таблицы и вставки / удаления определенных строк в промежуточных таблицах _Category_Book_ и _Author_Book_ поскольку Книга связана с отношениями «многие ко многим» с автором и категорией. Сообщение об ошибке, которое я получаю в консоли:

ОШИБКА com.ns.vertx.pg.BookJooqQueries - Ошибка, что-то не так в deleteCategoryBookFuture.compose (..)! Причина: io.vertx.core.VertxException: Соединение не открыто ЗАКРЫТО

Кроме того, я использую смесь экземпляров DAO и метода execute () для экземпляра ReactiveClassicGenericQueryExecutor класс. Это ссылка репо на мой класс, где я получаю эту ошибку, и это HttpVerticle , где для моих веб-служб RESTful выполняются маршруты, DAO и другие настройки.

Я не знаю, есть ли вероятность того, что я «перекомпоновал» экземпляры Future и именно это вызывает эту ошибку, но, как я понял, композиция используется при определенных операциях ( Вставить / Удалить / Обновить ) должны выполняться в последовательном порядке, и все должны быть успешными.

Библиотеки, которые я использую: Версия Vert.x: 3.8.2 vertx-jooq-classi c -реактивный : 5.0.1 postgresql: 42.2.2 (Postgres БД версии 11.7 на моем компьютере)

ПРИМЕЧАНИЕ. Эти изменения внесены в мою ветку book_CRUD , не путать с master (поскольку я не хочу объединять эти не полностью функциональные изменения ).

1 Ответ

0 голосов
/ 02 мая 2020

Мне (если быть более честным @ jklingsporn ) удалось найти решение для решения проблемы. Проблема заключалась в том, что (насколько я понял) состоит в том, чтобы составлять не экземпляры Future, а их правые значения (то есть вызовы методов). Например, мой код был написан так:

 Set<Long> deleteCategoryIdsSet = HashSet();
    Future<Integer> insertBCFuture = categoryBookDAO.insert(bookCategories);
    Future<Integer> deleteCategoryBookFuture = queryExecutor.execute(dsl -> dsl
                        .deleteFrom(CATEGORY_BOOK)
                        .where(CATEGORY_BOOK.BOOK_ID.eq(Long.valueOf(bookId)))
                        .and(CATEGORY_BOOK.CATEGORY_ID.in(deleteCategoryIdsSet)))
    Future<Integer> retVal = insertBCFuture.compose(res -> deleteCategoryBookFuture)
                   .setHandler(finalResRetVal -> {
                        // handle 'finalResRetVal'
..});

... и изменил его на это, как предложил @jklingsporn:

return queryExecutor.execute(dsl -> dsl
                        .deleteFrom(CATEGORY_BOOK)
                        .where(CATEGORY_BOOK.BOOK_ID.eq(Long.valueOf(bookId)))
                        .and(CATEGORY_BOOK.CATEGORY_ID.in(deleteCategoryIdsSet)))
                    .compose(res -> categoryBookDAO.insert(bookCategories));

Таким (решенным) способом код будущего. магически не задерживается , ошибка не отображается, удаляются и вставки успешно выполняются.

...