Jooq-транзакции: соединения не выводятся в пул, если исключение выбрано в транзакции

Я использую HikariCP с Jooq. Код: * В Котлине:

//dataSource is from Hikari DSL.using(dataSource, sqlDialect).transaction { config -> //in create it simply calls dsl.insertInto .... UserRepo.create(User(name="joe"), DSL.using(config)) UserRepo.create(User(name="foo"), DSL.using(config)) } 

И все работает нормально.

Но если я вбрасываю блок, соединения не закрываются (освобождаются) (хотя транзакция откатывается).

ОБНОВИТЬ:

Я новичок в Java, так что это была моя ошибка. В тесте я использовал бросок Kotlin Throwable (а не Exception ), который неправильно обрабатывался частью кода Java.

Все работает так, как ожидалось, с обычными исключениями.

Solutions Collecting From Web of "Jooq-транзакции: соединения не выводятся в пул, если исключение выбрано в транзакции"

Как вы заметили, с учетом вашего редактирования вопроса jOOQ внутренне захватывает только подтипы Exception , а не Throwable подтипы, чтобы влиять на управление транзакциями. В DefaultDSLContext.transactionResult0() вы можете увидеть следующий код (принятый вариант версии 3.9.6, сокращенный для этого вопроса):

 try { provider.begin(ctx); result = transactional.run(ctx.configuration()); provider.commit(ctx); } catch (Exception cause) { // <-- This is the problem ctx.cause(cause); provider.rollback(ctx); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else { throw new DataAccessException("Rollback caused", cause); } } 

Как вы можете видеть, в то время как существует различие между проверенными и непроверенными исключениями , нет разницы между Exception и Throwable .

Обоснование, в Java против Kotlin / Scala

Исторически, на Java, никто не создает Throwable подтипы. Этот тип существует только как общий тип супер для Exception и Error . Таким образом, предполагается, что Throwable является одним из вышеперечисленных, и типы Error обычно не должны быть пойманы никаким кодом клиента / библиотеки.

Это допущение недействительно на таких языках, как Kotlin и Scala, которые не наследуют этого, по общему признанию, немного странного дизайна API с ранних Java-дней. Нет причин, по которым пользовательское исключение не должно напрямую распространять Throwable . К сожалению, статус-кво означает, что вы не можете использовать комбайны, вы должны бросать исключения.

ошибка

Это, безусловно, ошибка в jOOQ и должна быть исправлена: https://github.com/jOOQ/jOOQ/issues/6608

Поскольку он несколько обратный-несовместимый с точки зрения поведения, он будет фиксирован только в незначительном выпуске, т. Е. 3.10