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.

  • Kotlin: la propiedad debe inicializarse o ser abstracta incluso si hay una function init ()
  • Async no espera a la espera
  • Kotlin detecta el time de espera a petición del server
  • RxKotlin - Single.just () no se emite al suscribirse TestSubscriber
  • Spring Boot + Kotlin AutoProxyRegistrar causa la exception de Nullpointer
  • ¿Cómo orderar LinkedHashMap por valores en Kotlin?
  • ¿Cómo llamar al súper método de la class externa desde la class interna en Kotlin?
  • Kotlin para assertThat (foo, instanceOf (Bar.class))
  • No se puede conectar a Remote Mongo DB mediante Springboot
  • arrayListOf y hashMapOf: reference no resuelta
  • MutableLiveData con Kotlin Multiple Layler Genérico no funciona