Transacciones de Jooq: las conexiones no se liberan al set, si se lanza una exception en la transacción

Estoy usando HikariCP con Jooq. El código: * En Kotlin:

//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)) } 

Y todo funciona bien

Pero si tiro en bloque, las conexiones no se cierran (se liberan) (aunque la transacción se revierte).

ACTUALIZAR:

Soy nuevo en Java, así que fue mi culpa. En la testing, solía arrojar Kotlin's Throwable (no la Exception ), que no fue manejada correctamente por parte de Java del código.

Todo funciona como se espera con excepciones regulares.

Como habrás notado, dada la edición de tu pregunta, jOOQ captura internamente solo los subtypes de Exception , no los subtypes Throwable para influir en la gestión de las transactions. En DefaultDSLContext.transactionResult0() , puede ver el siguiente código (tomado de la versión 3.9.6, abreviada para esta pregunta):

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

Como puede ver, aunque existe una distinción entre las excepciones marcadas y las no verificadas, no existe distinción entre Exception y Throwable .

Justificación, en Java vs Kotlin / Scala

Históricamente, en Java, nadie realmente crea subtypes Throwable . Ese tipo solo existe como un súper tipo común para Exception y Error . Entonces, la suposition es que un Throwable es cualquiera de los anteriores, y los types de Error generalmente no deberían ser capturados por ningún código de cliente / biblioteca.

Esa suposition es invalidada por lenguajes como Kotlin y Scala, que no henetworkingan esto, un layout de API un poco extraño desde los primeros días de Java. No hay ninguna razón por la cual una exception definida por el usuario no se extienda directamente a Throwable . Desafortunadamente, el status quo significa que no puedes usar throwables, tienes que lanzar excepciones.

Error

Esto es ciertamente un error en jOOQ y debería ser corregido: https://github.com/jOOQ/jOOQ/issues/6608

Como es un tanto incompatible en términos de comportamiento, solo se fijará en una versión menor, es decir, 3.10.

  • Disparador usando Teamcity Kotlin DSL
  • Kotlin smart cast no funciona para LinearLayout.LayoutParams
  • Aplicación Kotlin con plugin de aplicación Gradle
  • Kotlin: ¿parameters de function enviados pero no ejecutados?
  • No se puede hacer que Coverity Scan funcione (Java / Kotlin / Gradle 3.3 en Windows y Travis)
  • ¿Cómo eliminar inputs duplicadas de FragmentManager?
  • Kotlin generics wildcard con extender
  • Cómo configurar el reempaquetado de los botines de spring con gradle-script-kotlin
  • Pausa y reanuda la animation de Lottie
  • Kotlin con stack RxKotlinFX da un error de class de acceso
  • Kotlin: ambigüedad de resolución de sobrecarga en Eclipse, pero no en IntelliJ