Skip to content

Commit 5f9ebde

Browse files
committed
possible mitigation for Oracle fetch size issue
1 parent afd2628 commit 5f9ebde

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.sql.Types;
1212
import java.time.temporal.ChronoField;
1313
import java.time.temporal.TemporalAccessor;
14+
import java.util.Properties;
1415
import java.util.TimeZone;
1516
import java.util.regex.Matcher;
1617
import java.util.regex.Pattern;
@@ -19,6 +20,7 @@
1920
import org.hibernate.QueryTimeoutException;
2021
import org.hibernate.boot.model.FunctionContributions;
2122
import org.hibernate.boot.model.TypeContributions;
23+
import org.hibernate.cfg.JdbcSettings;
2224
import org.hibernate.dialect.aggregate.AggregateSupport;
2325
import org.hibernate.dialect.aggregate.OracleAggregateSupport;
2426
import org.hibernate.dialect.function.CommonFunctionFactory;
@@ -212,6 +214,8 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr
212214

213215
protected final int driverMinorVersion;
214216

217+
private final int defaultFetchSize;
218+
215219

216220
public OracleDialect() {
217221
this( MINIMUM_VERSION );
@@ -222,6 +226,7 @@ public OracleDialect(DatabaseVersion version) {
222226
autonomous = false;
223227
extended = false;
224228
applicationContinuity = false;
229+
defaultFetchSize = -1;
225230
driverMajorVersion = 19;
226231
driverMinorVersion = 0;
227232
}
@@ -235,6 +240,7 @@ public OracleDialect(DialectResolutionInfo info, OracleServerConfiguration serve
235240
autonomous = serverConfiguration.isAutonomous();
236241
extended = serverConfiguration.isExtended();
237242
applicationContinuity = serverConfiguration.isApplicationContinuity();
243+
defaultFetchSize = serverConfiguration.getDefaultFetchSize();
238244
this.driverMinorVersion = serverConfiguration.getDriverMinorVersion();
239245
this.driverMajorVersion = serverConfiguration.getDriverMajorVersion();
240246
}
@@ -290,6 +296,15 @@ protected DatabaseVersion getMinimumSupportedVersion() {
290296
return MINIMUM_VERSION;
291297
}
292298

299+
@Override
300+
public Properties getDefaultProperties() {
301+
final Properties defaultProperties = super.getDefaultProperties();
302+
if ( defaultFetchSize > 0 && defaultFetchSize < 200 ) {
303+
defaultProperties.setProperty( JdbcSettings.STATEMENT_FETCH_SIZE, Integer.toString( 1024 ) );
304+
}
305+
return defaultProperties;
306+
}
307+
293308
@Override
294309
public int getPreferredSqlTypeCodeForBoolean() {
295310
// starting 23c we support Boolean type natively

hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class OracleServerConfiguration {
3030
private final boolean autonomous;
3131
private final boolean extended;
3232
private final boolean applicationContinuity;
33+
private final int defaultFetchSize;
3334
private final int driverMajorVersion;
3435
private final int driverMinorVersion;
3536

@@ -53,27 +54,33 @@ public int getDriverMinorVersion() {
5354
return driverMinorVersion;
5455
}
5556

57+
public int getDefaultFetchSize() {
58+
return defaultFetchSize;
59+
}
60+
5661
public OracleServerConfiguration(boolean autonomous, boolean extended) {
57-
this( autonomous, extended, false, 19, 0 );
62+
this( autonomous, extended, false, -1, 19, 0 );
5863
}
5964

6065
public OracleServerConfiguration(
6166
boolean autonomous,
6267
boolean extended,
6368
int driverMajorVersion,
6469
int driverMinorVersion) {
65-
this(autonomous, extended, false, driverMajorVersion, driverMinorVersion);
70+
this(autonomous, extended, false, -1, driverMajorVersion, driverMinorVersion);
6671
}
6772

6873
public OracleServerConfiguration(
6974
boolean autonomous,
7075
boolean extended,
7176
boolean applicationContinuity,
77+
int defaultFetchSize,
7278
int driverMajorVersion,
7379
int driverMinorVersion) {
7480
this.autonomous = autonomous;
7581
this.extended = extended;
7682
this.applicationContinuity = applicationContinuity;
83+
this.defaultFetchSize = defaultFetchSize;
7784
this.driverMajorVersion = driverMajorVersion;
7885
this.driverMinorVersion = driverMinorVersion;
7986
}
@@ -82,6 +89,7 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut
8289
Boolean extended = null;
8390
Boolean autonomous = null;
8491
Boolean applicationContinuity = null;
92+
int defaultFetchSize = -1;
8593
Integer majorVersion = null;
8694
Integer minorVersion = null;
8795
final DatabaseMetaData databaseMetaData = info.getDatabaseMetadata();
@@ -95,6 +103,8 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut
95103

96104
try (final Statement statement = c.createStatement()) {
97105

106+
defaultFetchSize = statement.getFetchSize();
107+
98108
// Use Oracle JDBC replay statistics information to determine if this
99109
// connection is protected by Application Continuity
100110
try {
@@ -185,7 +195,8 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut
185195
}
186196

187197
}
188-
return new OracleServerConfiguration( autonomous, extended, applicationContinuity, majorVersion, minorVersion );
198+
return new OracleServerConfiguration( autonomous, extended, applicationContinuity, defaultFetchSize,
199+
majorVersion, minorVersion );
189200
}
190201

191202
private static boolean isAutonomous(String cloudServiceParam) {

0 commit comments

Comments
 (0)