From a1f2300a7ca4c26e6fd4e5b19e092d2c7a01494d Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 31 Oct 2025 14:26:28 +0100 Subject: [PATCH] [#2699] Make sure to close the connection in case of error I've tested it while working on #2518, but I don't know how to create an isolated test. --- .../hibernate/reactive/logging/impl/Log.java | 5 ++++- .../session/impl/ReactiveSessionImpl.java | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/logging/impl/Log.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/logging/impl/Log.java index e171fad27..26743d7af 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/logging/impl/Log.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/logging/impl/Log.java @@ -270,6 +270,10 @@ public interface Log extends BasicLogger { @Message(id = 85, value = "Reactive sessions do not support transparent lazy fetching - use Stage.fetch() or Mutiny.fetch() (property '%1$S' of entity '%2$s' was not loaded)") LazyInitializationException lazyFieldInitializationException(String fieldName, String entityName); + @LogMessage(level = ERROR) + @Message(id = 86, value = "Error closing reactive connection") + void errorClosingConnection(@Cause Throwable throwable); + // Same method that exists in CoreMessageLogger @LogMessage(level = WARN) @Message(id = 104, value = "firstResult/maxResults specified with collection fetch; applying in memory!" ) @@ -328,5 +332,4 @@ public interface Log extends BasicLogger { " This is probably due to an operation failing fast due to the transaction being marked for rollback.", id = 520) void jdbcExceptionThrownWithTransactionRolledBack(@Cause JDBCException e); - } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java index 0e1fdf119..2b74f2d77 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java @@ -1738,7 +1738,23 @@ public void close() throws HibernateException { @Override public CompletionStage reactiveClose() { - super.close(); + try { + super.close(); + return closeConnection(); + } + catch (RuntimeException e) { + return closeConnection() + .handle( CompletionStages::handle ) + .thenCompose( closeConnectionHandler -> { + if ( closeConnectionHandler.hasFailed() ) { + LOG.errorClosingConnection( closeConnectionHandler.getThrowable() ); + } + return failedFuture( e ); + } ); + } + } + + private CompletionStage closeConnection() { return reactiveConnection != null ? reactiveConnection.close() : voidFuture();