Skip to content

Commit 4b60941

Browse files
committed
HHH-19653 include the JDBC fetch size in the database info log
and get fetch size and isolation level from a new connection if we don't know them
1 parent eee7c5f commit 4b60941

File tree

10 files changed

+117
-48
lines changed

10 files changed

+117
-48
lines changed

hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
import static java.util.function.Function.identity;
4040
import static java.util.stream.Collectors.toMap;
4141
import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX;
42+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
43+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize;
44+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation;
4245
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
4346

4447
/**
@@ -81,7 +84,7 @@ private static String extractIsolationAsString(Map<String, Object> properties) {
8184
final Integer isolation = ConnectionProviderInitiator.extractIsolation( properties );
8285
return isolation != null ?
8386
// Agroal resolves transaction isolation from the 'nice' name
84-
ConnectionProviderInitiator.toIsolationNiceName( isolation )
87+
toIsolationNiceName( isolation )
8588
: null;
8689
}
8790

@@ -177,11 +180,12 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
177180
: extractDriverNameFromMetadata(),
178181
dialect.getVersion(),
179182
Boolean.toString( acfc.autoCommit() ),
180-
acfc.jdbcTransactionIsolation() != null
181-
? ConnectionProviderInitiator.toIsolationNiceName( acfc.jdbcTransactionIsolation().level() )
182-
: null,
183+
acfc.jdbcTransactionIsolation() != null && acfc.jdbcTransactionIsolation().isDefined()
184+
? toIsolationNiceName( acfc.jdbcTransactionIsolation().level() )
185+
: toIsolationNiceName( getIsolation( agroalDataSource ) ),
183186
acpc.minSize(),
184-
acpc.maxSize()
187+
acpc.maxSize(),
188+
getFetchSize( agroalDataSource )
185189
);
186190
}
187191

hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
1010
import org.hibernate.cfg.JdbcSettings;
1111
import org.hibernate.dialect.Dialect;
12-
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
1312
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
1413
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1514
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
@@ -40,7 +39,12 @@
4039
import static org.hibernate.cfg.C3p0Settings.C3P0_MAX_STATEMENTS;
4140
import static org.hibernate.cfg.C3p0Settings.C3P0_MIN_SIZE;
4241
import static org.hibernate.cfg.C3p0Settings.C3P0_TIMEOUT;
42+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.extractIsolation;
4343
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.extractSetting;
44+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.getConnectionProperties;
45+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
46+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize;
47+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation;
4448
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
4549
import static org.hibernate.internal.util.config.ConfigurationHelper.getInteger;
4650

@@ -149,23 +153,28 @@ public void configure(Map<String, Object> properties) {
149153
// as soon as we obtain a new connection. This maybe isn't ideal,
150154
// and it's not what we do with Agroal or Hikari.
151155
autocommit = getBoolean( JdbcSettings.AUTOCOMMIT, properties ); // defaults to false
152-
isolation = ConnectionProviderInitiator.extractIsolation( properties );
156+
isolation = extractIsolation( properties );
153157

154-
final Properties connectionProps = ConnectionProviderInitiator.getConnectionProperties( properties );
155-
final Map<String, Object> poolSettings = poolSettings( properties );
158+
final Properties connectionProps = getConnectionProperties( properties );
159+
final var poolSettings = poolSettings( properties );
156160
dataSource = createDataSource( jdbcUrl, connectionProps, poolSettings );
157161

162+
final Integer fetchSize = getFetchSize( dataSource );
163+
if ( isolation == null ) {
164+
isolation = getIsolation( dataSource );
165+
}
158166
dbInfoProducer = dialect -> new DatabaseConnectionInfoImpl(
159167
C3P0ConnectionProvider.class,
160168
jdbcUrl,
161169
jdbcDriverClass,
162170
dialect.getVersion(),
163171
Boolean.toString( autocommit ),
164-
isolation == null ? null : ConnectionProviderInitiator.toIsolationNiceName( isolation ),
172+
isolation == null ? null : toIsolationNiceName( isolation ),
165173
requireNonNullElse( getInteger( C3P0_STYLE_MIN_POOL_SIZE.substring( 5 ), poolSettings ),
166174
DEFAULT_MIN_POOL_SIZE ),
167175
requireNonNullElse( getInteger( C3P0_STYLE_MAX_POOL_SIZE.substring( 5 ), poolSettings ),
168-
DEFAULT_MAX_POOL_SIZE )
176+
DEFAULT_MAX_POOL_SIZE ),
177+
fetchSize
169178
);
170179
}
171180

hibernate-c3p0/src/test/java/org/hibernate/test/c3p0/C3P0ConnectionProviderTest.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,15 @@
55
package org.hibernate.test.c3p0;
66

77
import java.lang.management.ManagementFactory;
8-
import java.util.HashMap;
9-
import java.util.Map;
108
import java.util.Set;
119
import javax.management.MBeanServer;
1210
import javax.management.ObjectName;
1311

1412
import org.hibernate.c3p0.internal.C3P0ConnectionProvider;
15-
import org.hibernate.cfg.Environment;
1613
import org.hibernate.dialect.SybaseASEDialect;
1714
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.ConnectionProviderJdbcConnectionAccess;
1815
import org.hibernate.engine.jdbc.spi.JdbcServices;
1916

20-
import org.hibernate.testing.orm.junit.JiraKey;
2117
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
2218
import org.hibernate.testing.orm.junit.SkipForDialect;
2319
import org.junit.Test;
@@ -92,17 +88,4 @@ public void testHHH6635() throws Exception {
9288

9389
assertTrue( "PooledDataSource BMean not found, please verify version of c3p0", mbeanfound );
9490
}
95-
96-
@Test @JiraKey(value="HHH-9498")
97-
public void testIsolationPropertyCouldBeEmpty() {
98-
C3P0ConnectionProvider provider = new C3P0ConnectionProvider();
99-
try {
100-
Map<String,Object> configuration = new HashMap<>();
101-
configuration.put( Environment.ISOLATION, "" );
102-
provider.configure( configuration );
103-
}
104-
finally {
105-
provider.stop();
106-
}
107-
}
10891
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
*/
55
package org.hibernate.engine.jdbc.connections.internal;
66

7+
import java.sql.SQLException;
78
import java.util.Map;
89

10+
import org.checkerframework.checker.nullness.qual.Nullable;
911
import org.hibernate.cfg.JdbcSettings;
1012
import org.hibernate.dialect.DatabaseVersion;
1113
import org.hibernate.dialect.Dialect;
@@ -14,6 +16,8 @@
1416
import org.hibernate.internal.util.NullnessHelper;
1517
import org.hibernate.internal.util.config.ConfigurationHelper;
1618

19+
import javax.sql.DataSource;
20+
1721
import static org.hibernate.dialect.SimpleDatabaseVersion.ZERO_VERSION;
1822
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.interpretIsolation;
1923
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
@@ -37,6 +41,7 @@ public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo {
3741
protected final String isolationLevel;
3842
protected final Integer poolMinSize;
3943
protected final Integer poolMaxSize;
44+
private final Integer fetchSize;
4045

4146
public DatabaseConnectionInfoImpl(
4247
Class<? extends ConnectionProvider> connectionProviderClass,
@@ -46,7 +51,8 @@ public DatabaseConnectionInfoImpl(
4651
String autoCommitMode,
4752
String isolationLevel,
4853
Integer poolMinSize,
49-
Integer poolMaxSize) {
54+
Integer poolMaxSize,
55+
Integer fetchSize) {
5056
this.connectionProviderClass = connectionProviderClass;
5157
this.jdbcUrl = nullIfEmpty( jdbcUrl );
5258
this.jdbcDriver = nullIfEmpty( jdbcDriver );
@@ -55,6 +61,7 @@ public DatabaseConnectionInfoImpl(
5561
this.isolationLevel = nullIfEmpty( isolationLevel );
5662
this.poolMinSize = poolMinSize;
5763
this.poolMaxSize = poolMaxSize;
64+
this.fetchSize = fetchSize;
5865
}
5966

6067
public DatabaseConnectionInfoImpl(Map<String, Object> settings, Dialect dialect) {
@@ -67,12 +74,33 @@ public DatabaseConnectionInfoImpl(Map<String, Object> settings, Dialect dialect)
6774
determineIsolationLevel( settings ),
6875
// No setting for min. pool size
6976
null,
70-
determinePoolMaxSize( settings )
77+
determinePoolMaxSize( settings ),
78+
null
7179
);
7280
}
7381

7482
public DatabaseConnectionInfoImpl(Dialect dialect) {
75-
this( null, null, null, dialect.getVersion(), null, null, null, null );
83+
this( null, null, null, dialect.getVersion(), null, null, null, null, null );
84+
}
85+
86+
public static Integer getFetchSize(DataSource dataSource) {
87+
try ( var conn = dataSource.getConnection() ) {
88+
try ( var statement = conn.createStatement() ) {
89+
return statement.getFetchSize();
90+
}
91+
}
92+
catch ( SQLException ignored ) {
93+
return null;
94+
}
95+
}
96+
97+
public static Integer getIsolation(DataSource dataSource) {
98+
try ( var conn = dataSource.getConnection() ) {
99+
return conn.getTransactionIsolation();
100+
}
101+
catch ( SQLException ignored ) {
102+
return null;
103+
}
76104
}
77105

78106
@Override
@@ -110,16 +138,34 @@ public Integer getPoolMaxSize() {
110138
return poolMaxSize;
111139
}
112140

141+
@Override
142+
public @Nullable Integer getJdbcFetchSize() {
143+
return fetchSize;
144+
}
145+
113146
@Override
114147
public String toInfoString() {
115-
return "\tDatabase JDBC URL [" + handleEmpty( jdbcUrl ) + ']' +
116-
"\n\tDatabase driver: " + handleEmpty( jdbcDriver ) +
117-
"\n\tDatabase version: " + handleEmpty( dialectVersion ) +
118-
"\n\tAutocommit mode: " + handleEmpty( autoCommitMode ) +
119-
"\n\tIsolation level: " + handleEmpty( isolationLevel ) +
120-
"\n\tPool: " + handleEmpty( connectionProviderClass ) +
121-
"\n\tMinimum pool size: " + handleEmpty( poolMinSize ) +
122-
"\n\tMaximum pool size: " + handleEmpty( poolMaxSize );
148+
return """
149+
\tDatabase JDBC URL [%s]
150+
\tDatabase driver: %s
151+
\tDatabase version: %s
152+
\tAutocommit mode: %s
153+
\tIsolation level: %s
154+
\tJDBC fetch size: %s
155+
\tPool: %s
156+
\tMinimum pool size: %s
157+
\tMaximum pool size: %s"""
158+
.formatted(
159+
handleEmpty( jdbcUrl ),
160+
handleEmpty( jdbcDriver ),
161+
handleEmpty( dialectVersion ),
162+
handleEmpty( autoCommitMode ),
163+
handleEmpty( isolationLevel ),
164+
handleEmpty( fetchSize ),
165+
handleEmpty( connectionProviderClass ),
166+
handleEmpty( poolMinSize ),
167+
handleEmpty( poolMaxSize )
168+
);
123169
}
124170

125171
private static String handleEmpty(String value) {
@@ -131,6 +177,10 @@ private static String handleEmpty(DatabaseVersion dialectVersion) {
131177
}
132178

133179
private static String handleEmpty(Integer value) {
180+
return value != null ? ( value == 0 ? "none" : value.toString() ) : DEFAULT;
181+
}
182+
183+
private static String handleFetchSize(Integer value) {
134184
return value != null ? value.toString() : DEFAULT;
135185
}
136186

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,21 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, Extract
160160
final String url;
161161
final String driver;
162162
final String isolationLevel;
163+
final Integer fetchSize;
163164
if ( metaData != null ) {
164165
url = metaData.getUrl();
165166
driver = metaData.getDriver();
166-
isolationLevel = toIsolationNiceName( metaData.getTransactionIsolation() )
167+
isolationLevel =
168+
toIsolationNiceName( metaData.getTransactionIsolation() )
167169
+ " [default " + toIsolationNiceName( metaData.getDefaultTransactionIsolation() ) + "]";
170+
final int defaultFetchSize = metaData.getDefaultFetchSize();
171+
fetchSize = defaultFetchSize == -1 ? null : defaultFetchSize;
168172
}
169173
else {
170174
url = null;
171175
driver = null;
172176
isolationLevel = null;
177+
fetchSize = null;
173178
}
174179

175180
return new DatabaseConnectionInfoImpl(
@@ -180,7 +185,8 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, Extract
180185
null,
181186
isolationLevel,
182187
null,
183-
null
188+
null,
189+
fetchSize
184190
) {
185191
@Override
186192
public String toInfoString() {

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import org.hibernate.internal.log.ConnectionInfoLogger;
3838

3939
import static org.hibernate.cfg.JdbcSettings.JAKARTA_JDBC_URL;
40+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.extractIsolation;
41+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.getConnectionProperties;
4042
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
4143
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
4244
import static org.hibernate.internal.util.config.ConfigurationHelper.getInt;
@@ -134,10 +136,10 @@ private static ConnectionCreator buildCreator(
134136

135137
final String driverList = success ? driverClassName : driverList();
136138

137-
final Properties connectionProps = ConnectionProviderInitiator.getConnectionProperties( configurationValues );
139+
final Properties connectionProps = getConnectionProperties( configurationValues );
138140

139141
final boolean autoCommit = getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues );
140-
final Integer isolation = ConnectionProviderInitiator.extractIsolation( configurationValues );
142+
final Integer isolation = extractIsolation( configurationValues );
141143
final String initSql = (String) configurationValues.get( INIT_SQL );
142144

143145
final ConnectionCreatorFactory factory = getConnectionCreatorFactory( configurationValues, serviceRegistry );
@@ -150,7 +152,8 @@ private static ConnectionCreator buildCreator(
150152
Boolean.toString( autoCommit ),
151153
isolation != null ? toIsolationNiceName( isolation ) : null,
152154
getInt( MIN_SIZE, configurationValues, 1 ),
153-
getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 )
155+
getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ),
156+
null
154157
);
155158

156159
return factory.create(
@@ -292,7 +295,8 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
292295
dbInfo.getAutoCommitMode(),
293296
dbInfo.getIsolationLevel(),
294297
dbInfo.getPoolMinSize(),
295-
dbInfo.getPoolMaxSize()
298+
dbInfo.getPoolMaxSize(),
299+
dbInfo.getJdbcFetchSize()
296300
);
297301
}
298302

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DataSourceBasedMultiTenantConnectionProviderImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
125125
null,
126126
null,
127127
null,
128+
null,
128129
null
129130
) {
130131
@Override

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DatabaseConnectionInfo.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ public interface DatabaseConnectionInfo {
6161
@Nullable
6262
Integer getPoolMaxSize();
6363

64+
/**
65+
* The default JDBC fetch size.
66+
*/
67+
@Nullable
68+
Integer getJdbcFetchSize();
69+
6470
/**
6571
* Collects the information available here as a single String with the intent of using it in logging.
6672
*/

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/ExtractedDatabaseMetaData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public interface ExtractedDatabaseMetaData {
151151
int getDefaultTransactionIsolation();
152152

153153
/**
154-
* Retrieve the default JDBC {@link java.sql.Statement#getFetchSize fetch size}.
154+
* Retrieve the default JDBC {@linkplain java.sql.Statement#getFetchSize fetch size}.
155155
*/
156156
int getDefaultFetchSize();
157157

hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import com.zaxxer.hikari.HikariConfig;
2525
import com.zaxxer.hikari.HikariDataSource;
2626

27+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
28+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize;
29+
import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation;
2730
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
2831
import static org.hibernate.hikaricp.internal.HikariConfigurationUtil.loadConfiguration;
2932
import static org.hibernate.internal.util.StringHelper.isBlank;
@@ -105,9 +108,12 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
105108
: hikariConfig.getDriverClassName(),
106109
dialect.getVersion(),
107110
Boolean.toString( hikariConfig.isAutoCommit() ),
108-
hikariConfig.getTransactionIsolation(),
111+
hikariConfig.getTransactionIsolation() != null
112+
? hikariConfig.getTransactionIsolation()
113+
: toIsolationNiceName( getIsolation( hikariDataSource ) ),
109114
hikariConfig.getMinimumIdle(),
110-
hikariConfig.getMaximumPoolSize()
115+
hikariConfig.getMaximumPoolSize(),
116+
getFetchSize( hikariDataSource )
111117
);
112118
}
113119

0 commit comments

Comments
 (0)