diff --git a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java index 7eda7616f54e..8d45bb658cae 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/CoreMessageLogger.java @@ -33,9 +33,12 @@ import jakarta.transaction.Synchronization; import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.cfg.JdbcSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT; +import static org.hibernate.cfg.ValidationSettings.JAKARTA_VALIDATION_MODE; import static org.jboss.logging.Logger.Level.DEBUG; import static org.jboss.logging.Logger.Level.ERROR; import static org.jboss.logging.Logger.Level.INFO; +import static org.jboss.logging.Logger.Level.TRACE; import static org.jboss.logging.Logger.Level.WARN; /** @@ -562,7 +565,7 @@ void cannotResolveNonNullableTransientDependencies( void explicitSkipLockedLockCombo(); @LogMessage(level = INFO) - @Message(value = "'jakarta.persistence.validation.mode' named multiple values: %s", id = 448) + @Message(value = "'" + JAKARTA_VALIDATION_MODE + "' named multiple values: %s", id = 448) void multipleValidationModes(String modes); @LogMessage(level = WARN) @@ -722,7 +725,7 @@ void cannotResolveNonNullableTransientDependencies( void flushAndEvictOnRemove(String entityName); @LogMessage(level = ERROR) - @Message(value = "Illegal argument on static metamodel field injection : %s#%s; expected type : %s; encountered type : %s", id = 15007) + @Message(value = "Illegal argument on static metamodel field injection: %s#%s; expected type: %s; encountered type: %s", id = 15007) void illegalArgumentOnStaticMetamodelFieldInjection( String name, String name2, @@ -730,14 +733,14 @@ void illegalArgumentOnStaticMetamodelFieldInjection( String name4); @LogMessage(level = WARN) - @Message(value = "Unable to locate static metamodel field : %s#%s; this may or may not indicate a problem with the static metamodel", id = 15011) + @Message(value = "Unable to locate static metamodel field: %s#%s; this may or may not indicate a problem with the static metamodel", id = 15011) void unableToLocateStaticMetamodelField( String name, String name2); @LogMessage(level = DEBUG) - @Message(value = "Returning null (as required by JPA spec) rather than throwing EntityNotFoundException, " + - "as the entity (type=%s, id=%s) does not exist", id = 15013) + @Message(value = "Returning null (as required by JPA spec) rather than throwing EntityNotFoundException " + + "since the entity of type '%s' with id [%s] does not exist", id = 15013) void ignoringEntityNotFound(String entityName, String identifier); @LogMessage(level = DEBUG) @@ -754,6 +757,27 @@ void unableToLocateStaticMetamodelField( ) void duplicatedPersistenceUnitName(String name); + @LogMessage(level = DEBUG) + @Message( + id = 455, + value = + "'" + CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT + "' " + + """ + was enabled. This setting should only be enabled when JDBC Connections obtained by Hibernate \ + from the ConnectionProvider have auto-commit disabled. Enabling this setting when connections \ + have auto-commit enabled leads to execution of SQL operations outside of any JDBC transaction.\ + """ + ) + void connectionProviderDisablesAutoCommitEnabled(); + + @LogMessage(level = TRACE) + @Message(value = "Closing logical connection", id = 456) + void closingLogicalConnection(); + + @LogMessage(level = TRACE) + @Message(value = "Logical connection closed", id = 457) + void logicalConnectionClosed(); + @LogMessage(level = DEBUG) @Message( id = 401, diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java index 9463372c93f4..84b496294af9 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionManagedImpl.java @@ -14,14 +14,14 @@ import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; +import org.hibernate.internal.CoreLogging; +import org.hibernate.internal.CoreMessageLogger; import org.hibernate.resource.jdbc.LogicalConnection; import org.hibernate.resource.jdbc.ResourceRegistry; import org.hibernate.resource.jdbc.spi.JdbcEventHandler; import org.hibernate.resource.jdbc.spi.JdbcSessionContext; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; -import org.jboss.logging.Logger; - import static org.hibernate.ConnectionAcquisitionMode.IMMEDIATELY; import static org.hibernate.ConnectionReleaseMode.AFTER_STATEMENT; import static org.hibernate.ConnectionReleaseMode.BEFORE_TRANSACTION_COMPLETION; @@ -37,7 +37,7 @@ * @author Steve Ebersole */ public class LogicalConnectionManagedImpl extends AbstractLogicalConnectionImplementor { - private static final Logger log = Logger.getLogger( LogicalConnectionManagedImpl.class ); + private static final CoreMessageLogger log = CoreLogging.messageLogger( LogicalConnectionManagedImpl.class ); private final transient JdbcConnectionAccess jdbcConnectionAccess; private final transient JdbcEventHandler jdbcEventHandler; @@ -72,13 +72,7 @@ public LogicalConnectionManagedImpl( this.providerDisablesAutoCommit = jdbcSessionContext.doesConnectionProviderDisableAutoCommit(); if ( providerDisablesAutoCommit ) { - log.debug( - "`hibernate.connection.provider_disables_autocommit` was enabled. This setting should only be " + - "enabled when you are certain that the Connections given to Hibernate by the " + - "ConnectionProvider have auto-commit disabled. Enabling this setting when the " + - "Connections do not have auto-commit disabled will lead to Hibernate executing " + - "SQL operations outside of any JDBC/SQL transaction." - ); + log.connectionProviderDisablesAutoCommitEnabled(); } } @@ -98,12 +92,10 @@ public LogicalConnectionManagedImpl( private PhysicalConnectionHandlingMode determineConnectionHandlingMode( PhysicalConnectionHandlingMode connectionHandlingMode, JdbcConnectionAccess jdbcConnectionAccess) { - if ( connectionHandlingMode.getReleaseMode() == AFTER_STATEMENT - && !jdbcConnectionAccess.supportsAggressiveRelease() ) { - return DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION; - } - - return connectionHandlingMode; + return connectionHandlingMode.getReleaseMode() == AFTER_STATEMENT + && !jdbcConnectionAccess.supportsAggressiveRelease() + ? DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION + : connectionHandlingMode; } private LogicalConnectionManagedImpl( @@ -159,7 +151,6 @@ public Connection getPhysicalConnection() { @Override public void afterStatement() { super.afterStatement(); - if ( connectionHandlingMode.getReleaseMode() == AFTER_STATEMENT ) { if ( getResourceRegistry().hasRegisteredResources() ) { log.debug( "Skipping aggressive release of JDBC Connection after-statement due to held resources" ); @@ -183,7 +174,6 @@ public void beforeTransactionCompletion() { @Override public void afterTransaction() { super.afterTransaction(); - if ( connectionHandlingMode.getReleaseMode() != ON_CLOSE ) { // NOTE : we check for !ON_CLOSE here (rather than AFTER_TRANSACTION) to also catch: // - AFTER_STATEMENT cases that were circumvented due to held resources @@ -199,9 +189,9 @@ public Connection manualDisconnect() { if ( closed ) { throw new ResourceClosedException( "Logical connection is closed" ); } - final Connection c = physicalConnection; + final Connection connection = physicalConnection; releaseConnection(); - return c; + return connection; } @Override @@ -209,41 +199,38 @@ public void manualReconnect(Connection suppliedConnection) { if ( closed ) { throw new ResourceClosedException( "Logical connection is closed" ); } - throw new IllegalStateException( "Cannot manually reconnect unless Connection was originally supplied by user" ); } private void releaseConnection() { - final Connection localVariableConnection = this.physicalConnection; - if ( localVariableConnection == null ) { - return; - } - - // We need to set the connection to null before we release resources, - // in order to prevent recursion into this method. - // Recursion can happen when we release resources and when batch statements are in progress: - // when releasing resources, we'll abort the batch statement, - // which will trigger "logicalConnection.afterStatement()", - // which in some configurations will release the connection. - this.physicalConnection = null; - try { + final Connection localVariableConnection = physicalConnection; + if ( localVariableConnection != null ) { + // We need to set the connection to null before we release resources, + // in order to prevent recursion into this method. + // Recursion can happen when we release resources and when batch statements are in progress: + // when releasing resources, we'll abort the batch statement, + // which will trigger "logicalConnection.afterStatement()", + // which in some configurations will release the connection. + physicalConnection = null; try { - getResourceRegistry().releaseResources(); - if ( !localVariableConnection.isClosed() ) { - sqlExceptionHelper.logAndClearWarnings( localVariableConnection ); + try { + getResourceRegistry().releaseResources(); + if ( !localVariableConnection.isClosed() ) { + sqlExceptionHelper.logAndClearWarnings( localVariableConnection ); + } + } + finally { + jdbcEventHandler.jdbcConnectionReleaseStart(); + jdbcConnectionAccess.releaseConnection( localVariableConnection ); } } + catch (SQLException e) { + throw sqlExceptionHelper.convert( e, "Unable to release JDBC Connection" ); + } finally { - jdbcEventHandler.jdbcConnectionReleaseStart(); - jdbcConnectionAccess.releaseConnection( localVariableConnection ); + jdbcEventHandler.jdbcConnectionReleaseEnd(); } } - catch (SQLException e) { - throw sqlExceptionHelper.convert( e, "Unable to release JDBC Connection" ); - } - finally { - jdbcEventHandler.jdbcConnectionReleaseEnd(); - } } @Override @@ -261,20 +248,17 @@ public static LogicalConnectionManagedImpl deserialize( @Override public Connection close() { - if ( closed ) { - return null; - } - - getResourceRegistry().releaseResources(); - - log.trace( "Closing logical connection" ); - try { - releaseConnection(); - } - finally { - // no matter what - closed = true; - log.trace( "Logical connection closed" ); + if ( !closed ) { + getResourceRegistry().releaseResources(); + log.closingLogicalConnection(); + try { + releaseConnection(); + } + finally { + // no matter what + closed = true; + log.logicalConnectionClosed(); + } } return null; } @@ -300,7 +284,6 @@ public void begin() { protected void afterCompletion() { resetConnection( initiallyAutoCommit ); initiallyAutoCommit = false; - afterTransaction(); } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionProvidedImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionProvidedImpl.java index 21488e20da75..cbd8e8bec581 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionProvidedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/jdbc/internal/LogicalConnectionProvidedImpl.java @@ -9,17 +9,19 @@ import java.io.ObjectOutputStream; import java.sql.Connection; +import org.hibernate.internal.CoreLogging; +import org.hibernate.internal.CoreMessageLogger; import org.hibernate.resource.jdbc.LogicalConnection; import org.hibernate.resource.jdbc.ResourceRegistry; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; -import org.jboss.logging.Logger; +import static org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode.IMMEDIATE_ACQUISITION_AND_HOLD; /** * @author Steve Ebersole */ public class LogicalConnectionProvidedImpl extends AbstractLogicalConnectionImplementor { - private static final Logger log = Logger.getLogger( LogicalConnection.class ); + private static final CoreMessageLogger log = CoreLogging.messageLogger( LogicalConnection.class ); private transient Connection providedConnection; private final boolean initiallyAutoCommit; @@ -30,7 +32,6 @@ public LogicalConnectionProvidedImpl(Connection providedConnection, ResourceRegi if ( providedConnection == null ) { throw new IllegalArgumentException( "Provided Connection cannot be null" ); } - this.providedConnection = providedConnection; this.initiallyAutoCommit = determineInitialAutoCommitMode( providedConnection ); } @@ -43,7 +44,7 @@ private LogicalConnectionProvidedImpl(boolean closed, boolean initiallyAutoCommi @Override public PhysicalConnectionHandlingMode getConnectionHandlingMode() { - return PhysicalConnectionHandlingMode.IMMEDIATE_ACQUISITION_AND_HOLD; + return IMMEDIATE_ACQUISITION_AND_HOLD; } @Override @@ -53,17 +54,15 @@ public boolean isOpen() { @Override public Connection close() { - log.trace( "Closing logical connection" ); - + log.closingLogicalConnection(); getResourceRegistry().releaseResources(); - try { return providedConnection; } finally { providedConnection = null; closed = true; - log.trace( "Logical connection closed" ); + log.logicalConnectionClosed(); } } @@ -99,14 +98,13 @@ public Connection manualDisconnect() { return providedConnection; } finally { - this.providedConnection = null; + providedConnection = null; } } @Override public void manualReconnect(Connection connection) { errorIfClosed(); - if ( connection == null ) { throw new IllegalArgumentException( "cannot reconnect using a null connection" ); } @@ -131,7 +129,6 @@ protected Connection getConnectionForTransactionManagement() { @Override protected void afterCompletion() { afterTransaction(); - resetConnection( initiallyAutoCommit ); } } diff --git a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/hbm2ddl/ConnectionHelper.java b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/hbm2ddl/ConnectionHelper.java index 60ef50acc52c..a8908ca5257b 100644 --- a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/hbm2ddl/ConnectionHelper.java +++ b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/hbm2ddl/ConnectionHelper.java @@ -22,22 +22,18 @@ public interface ConnectionHelper { * * @param needsAutoCommit Should connection be forced to auto-commit * if not already. - * @throws SQLException */ - public void prepare(boolean needsAutoCommit) throws SQLException; + void prepare(boolean needsAutoCommit) throws SQLException; /** * Get a reference to the connection we are using. * * @return The JDBC connection. - * @throws SQLException */ - public Connection getConnection() throws SQLException; + Connection getConnection() throws SQLException; /** * Release any resources held by this helper. - * - * @throws SQLException */ - public void release() throws SQLException; + void release() throws SQLException; }