diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index 686879c863d3..4e21cd679d2b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -102,6 +102,7 @@ import static org.hibernate.cfg.QuerySettings.PORTABLE_INTEGER_DIVISION; import static org.hibernate.cfg.QuerySettings.XML_FUNCTIONS_ENABLED; import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN; +import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER; import static org.hibernate.internal.CoreLogging.messageLogger; import static org.hibernate.internal.LockOptionsHelper.applyPropertiesToLockOptions; import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER; @@ -133,6 +134,13 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { private static final CoreMessageLogger log = messageLogger( SessionFactoryOptionsBuilder.class ); + /** + * A lower bound on the {@link java.sql.Statement#getFetchSize JDBC fetch size}. + * + * @see org.hibernate.cfg.JdbcSettings#STATEMENT_FETCH_SIZE + */ + public static final int MIN_FETCH_SIZE = 128; + private final String uuid = LocalObjectUuidHelper.generateLocalObjectUuid(); private final StandardServiceRegistry serviceRegistry; @@ -490,6 +498,16 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo getBoolean( USE_GET_GENERATED_KEYS, settings, meta.supportsGetGeneratedKeys() ); jdbcFetchSize = getInteger( STATEMENT_FETCH_SIZE, settings ); + if ( jdbcFetchSize == null ) { + final int defaultFetchSize = meta.getDefaultFetchSize(); + if ( defaultFetchSize > 0 && defaultFetchSize < MIN_FETCH_SIZE ) { + JDBC_MESSAGE_LOGGER.forcingFetchSize( defaultFetchSize, MIN_FETCH_SIZE ); + jdbcFetchSize = MIN_FETCH_SIZE; + } + else { + JDBC_MESSAGE_LOGGER.usingFetchSize( defaultFetchSize ); + } + } connectionHandlingMode = interpretConnectionHandlingMode( settings, serviceRegistry ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java index 85efb677dd6c..ac46cd09196b 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/JdbcLogging.java @@ -164,9 +164,9 @@ public interface JdbcLogging extends BasicLogger { @Message(value = "Using default JDBC fetch size: %s", id = 100122) void usingFetchSize(int fetchSize); - @LogMessage(level = WARN) - @Message(value = "Low default JDBC fetch size: %s (consider setting 'hibernate.jdbc.fetch_size')", id = 100123) - void warnLowFetchSize(int fetchSize); + @LogMessage(level = INFO) + @Message(value = "Low default JDBC fetch size: %s, forcing to: %s (consider setting 'hibernate.jdbc.fetch_size')", id = 100123) + void forcingFetchSize(int defaultFetchSize, int forcedFetchSize); @LogMessage(level = TRACE) @Message(value = "JDBC fetch size: %s", id = 100124) diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java index deb84a7860c4..040c16d3b606 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java @@ -10,7 +10,6 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.cfg.JdbcSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.StandardConverters; @@ -39,7 +38,6 @@ import static org.hibernate.cfg.MappingSettings.DEFAULT_CATALOG; import static org.hibernate.cfg.MappingSettings.DEFAULT_SCHEMA; import static org.hibernate.engine.config.spi.StandardConverters.STRING; -import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER; import static org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl.makeLobCreatorBuilder; /** @@ -107,8 +105,6 @@ public JdbcEnvironmentImpl(final ServiceRegistryImplementor serviceRegistry, fin new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport, dialect.getCatalogSeparator() ); lobCreatorBuilder = makeLobCreatorBuilder( dialect ); - - logJdbcFetchSize( extractedMetaDataSupport.getDefaultFetchSize(), cfgService ); } private static ConfigurationService configurationService(ServiceRegistryImplementor serviceRegistry) { @@ -321,8 +317,6 @@ public JdbcEnvironmentImpl( new QualifiedObjectNameFormatterStandardImpl( nameQualifierSupport, databaseMetaData ); lobCreatorBuilder = makeLobCreatorBuilder( dialect, cfgService.getSettings(), databaseMetaData.getConnection() ); - - logJdbcFetchSize( extractedMetaDataSupport.getDefaultFetchSize(), cfgService ); } private static IdentifierHelper identifierHelper( @@ -425,15 +419,4 @@ public SqlExceptionHelper getSqlExceptionHelper() { public LobCreatorBuilder getLobCreatorBuilder() { return lobCreatorBuilder; } - - private static void logJdbcFetchSize(int defaultFetchSize, ConfigurationService cfgService) { - if ( !cfgService.getSettings().containsKey( JdbcSettings.STATEMENT_FETCH_SIZE ) ) { - if ( defaultFetchSize > 0 && defaultFetchSize < 100 ) { - JDBC_MESSAGE_LOGGER.warnLowFetchSize( defaultFetchSize ); - } - else { - JDBC_MESSAGE_LOGGER.usingFetchSize( defaultFetchSize ); - } - } - } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java index 093d88c5b7fa..4e499c551264 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java @@ -25,6 +25,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.boot.internal.SessionFactoryOptionsBuilder.MIN_FETCH_SIZE; import static org.hibernate.engine.jdbc.JdbcLogging.JDBC_MESSAGE_LOGGER; /** @@ -234,7 +235,7 @@ private void setStatementFetchSize(PreparedStatement statement) throws SQLExcept else { if ( JDBC_MESSAGE_LOGGER.isDebugEnabled() ) { final int defaultFetchSize = statement.getFetchSize(); - if ( defaultFetchSize > 0 && defaultFetchSize < 100 ) { + if ( defaultFetchSize > 0 && defaultFetchSize < MIN_FETCH_SIZE ) { JDBC_MESSAGE_LOGGER.lowFetchSize( defaultFetchSize ); } }