Intereting Posts
Почему getMessage () является нерешенной ссылкой в ​​Kotlin с классом Exception? Функция расширения Котлина – Как сделать его глобальным? почему work.map (запуск потока) .foreach (join ()) работает в kotlin? Как реализовать общую функцию интерфейса в Котлин? Какие пакеты / функции импортируются по умолчанию в Котлин? Kotlin Деятельность, не включенная в APK Почему мы не можем отметить видимость класса как «защищенного» в котлин? Как преобразовать / преобразовать коллекцию в другую коллекцию по свойству элемента? Котлин назначает делегата после объявления переменной Java Stream с :: новым для Kotlin Компилировать Groovy и Kotlin? Как запустить тесты kotlintest с помощью gradle? MediaStore.Images получить полное изображение с большого пальца Uri / id Ошибка стекирования потока при использовании факториала рекурсией на ктолине Использование Kotlin в библиотеке Android, распространяемой как AAR

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.

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

Как вы заметили, с учетом вашего редактирования вопроса 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