From 5f9ebde10bc2d0776efdaedfc56e9e5931c85d02 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Fri, 17 Jan 2025 09:51:37 +0100 Subject: [PATCH] possible mitigation for Oracle fetch size issue --- .../org/hibernate/dialect/OracleDialect.java | 15 +++++++++++++++ .../dialect/OracleServerConfiguration.java | 17 ++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java index e94bc41125a7..27b00dcbc3ac 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java @@ -11,6 +11,7 @@ import java.sql.Types; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; +import java.util.Properties; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,6 +20,7 @@ import org.hibernate.QueryTimeoutException; import org.hibernate.boot.model.FunctionContributions; import org.hibernate.boot.model.TypeContributions; +import org.hibernate.cfg.JdbcSettings; import org.hibernate.dialect.aggregate.AggregateSupport; import org.hibernate.dialect.aggregate.OracleAggregateSupport; import org.hibernate.dialect.function.CommonFunctionFactory; @@ -212,6 +214,8 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr protected final int driverMinorVersion; + private final int defaultFetchSize; + public OracleDialect() { this( MINIMUM_VERSION ); @@ -222,6 +226,7 @@ public OracleDialect(DatabaseVersion version) { autonomous = false; extended = false; applicationContinuity = false; + defaultFetchSize = -1; driverMajorVersion = 19; driverMinorVersion = 0; } @@ -235,6 +240,7 @@ public OracleDialect(DialectResolutionInfo info, OracleServerConfiguration serve autonomous = serverConfiguration.isAutonomous(); extended = serverConfiguration.isExtended(); applicationContinuity = serverConfiguration.isApplicationContinuity(); + defaultFetchSize = serverConfiguration.getDefaultFetchSize(); this.driverMinorVersion = serverConfiguration.getDriverMinorVersion(); this.driverMajorVersion = serverConfiguration.getDriverMajorVersion(); } @@ -290,6 +296,15 @@ protected DatabaseVersion getMinimumSupportedVersion() { return MINIMUM_VERSION; } + @Override + public Properties getDefaultProperties() { + final Properties defaultProperties = super.getDefaultProperties(); + if ( defaultFetchSize > 0 && defaultFetchSize < 200 ) { + defaultProperties.setProperty( JdbcSettings.STATEMENT_FETCH_SIZE, Integer.toString( 1024 ) ); + } + return defaultProperties; + } + @Override public int getPreferredSqlTypeCodeForBoolean() { // starting 23c we support Boolean type natively diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java index 32a188a9e5b5..14a2a7d30bd2 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java @@ -30,6 +30,7 @@ public class OracleServerConfiguration { private final boolean autonomous; private final boolean extended; private final boolean applicationContinuity; + private final int defaultFetchSize; private final int driverMajorVersion; private final int driverMinorVersion; @@ -53,8 +54,12 @@ public int getDriverMinorVersion() { return driverMinorVersion; } + public int getDefaultFetchSize() { + return defaultFetchSize; + } + public OracleServerConfiguration(boolean autonomous, boolean extended) { - this( autonomous, extended, false, 19, 0 ); + this( autonomous, extended, false, -1, 19, 0 ); } public OracleServerConfiguration( @@ -62,18 +67,20 @@ public OracleServerConfiguration( boolean extended, int driverMajorVersion, int driverMinorVersion) { - this(autonomous, extended, false, driverMajorVersion, driverMinorVersion); + this(autonomous, extended, false, -1, driverMajorVersion, driverMinorVersion); } public OracleServerConfiguration( boolean autonomous, boolean extended, boolean applicationContinuity, + int defaultFetchSize, int driverMajorVersion, int driverMinorVersion) { this.autonomous = autonomous; this.extended = extended; this.applicationContinuity = applicationContinuity; + this.defaultFetchSize = defaultFetchSize; this.driverMajorVersion = driverMajorVersion; this.driverMinorVersion = driverMinorVersion; } @@ -82,6 +89,7 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut Boolean extended = null; Boolean autonomous = null; Boolean applicationContinuity = null; + int defaultFetchSize = -1; Integer majorVersion = null; Integer minorVersion = null; final DatabaseMetaData databaseMetaData = info.getDatabaseMetadata(); @@ -95,6 +103,8 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut try (final Statement statement = c.createStatement()) { + defaultFetchSize = statement.getFetchSize(); + // Use Oracle JDBC replay statistics information to determine if this // connection is protected by Application Continuity try { @@ -185,7 +195,8 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut } } - return new OracleServerConfiguration( autonomous, extended, applicationContinuity, majorVersion, minorVersion ); + return new OracleServerConfiguration( autonomous, extended, applicationContinuity, defaultFetchSize, + majorVersion, minorVersion ); } private static boolean isAutonomous(String cloudServiceParam) {