From 9fa2e91355af82095103010f13450eaf358fea70 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Dec 2024 22:40:08 +0100 Subject: [PATCH 1/6] report the name of the ConnectionProvider along with the other info --- .../internal/AgroalConnectionProvider.java | 1 + .../c3p0/internal/C3P0ConnectionProvider.java | 1 + .../internal/DatabaseConnectionInfoImpl.java | 12 +++++++++- .../DatasourceConnectionProviderImpl.java | 1 + .../DriverManagerConnectionProviderImpl.java | 2 ++ ...asedMultiTenantConnectionProviderImpl.java | 22 +++++++++---------- .../internal/HikariCPConnectionProvider.java | 1 + .../internal/UCPConnectionProvider.java | 1 + 8 files changed, 29 insertions(+), 12 deletions(-) diff --git a/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java b/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java index 40fdf741d2ce..f568266400d1 100644 --- a/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java +++ b/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java @@ -167,6 +167,7 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { agroalDataSource.getConfiguration().connectionPoolConfiguration(); final AgroalConnectionFactoryConfiguration acfc = acpc.connectionFactoryConfiguration(); return new DatabaseConnectionInfoImpl( + AgroalConnectionProvider.class, acfc.jdbcUrl(), // Attempt to resolve the driver name from the dialect, // in case it wasn't explicitly set and access to the diff --git a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java index a47a80ad4a9f..b9e10ed0d872 100644 --- a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java +++ b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java @@ -152,6 +152,7 @@ public void configure(Map properties) { dataSource = createDataSource( jdbcUrl, connectionProps, poolSettings ); dbInfoProducer = dialect -> new DatabaseConnectionInfoImpl( + C3P0ConnectionProvider.class, jdbcUrl, jdbcDriverClass, dialect.getVersion(), diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java index 1c956f914678..14859f5f75ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java @@ -9,6 +9,7 @@ import org.hibernate.cfg.JdbcSettings; import org.hibernate.dialect.DatabaseVersion; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo; import org.hibernate.internal.util.NullnessHelper; import org.hibernate.internal.util.StringHelper; @@ -27,6 +28,7 @@ public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo { public static final String DEFAULT = "undefined/unknown"; + private final Class connectionProviderClass; protected final String jdbcUrl; protected final String jdbcDriver; protected final DatabaseVersion dialectVersion; @@ -36,6 +38,7 @@ public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo { protected final Integer poolMaxSize; public DatabaseConnectionInfoImpl( + Class connectionProviderClass, String jdbcUrl, String jdbcDriver, DatabaseVersion dialectVersion, @@ -43,6 +46,7 @@ public DatabaseConnectionInfoImpl( String isolationLevel, Integer poolMinSize, Integer poolMaxSize) { + this.connectionProviderClass = connectionProviderClass; this.jdbcUrl = nullIfEmpty( jdbcUrl ); this.jdbcDriver = nullIfEmpty( jdbcDriver ); this.dialectVersion = dialectVersion; @@ -54,6 +58,7 @@ public DatabaseConnectionInfoImpl( public DatabaseConnectionInfoImpl(Map settings, Dialect dialect) { this( + null, determineUrl( settings ), determineDriver( settings ), dialect.getVersion(), @@ -66,7 +71,7 @@ public DatabaseConnectionInfoImpl(Map settings, Dialect dialect) } public DatabaseConnectionInfoImpl(Dialect dialect) { - this( null, null, dialect.getVersion(), null, null, null, null ); + this( null, null, null, dialect.getVersion(), null, null, null, null ); } @Override @@ -111,6 +116,7 @@ public String toInfoString() { "\n\tDatabase version: " + handleEmpty( dialectVersion ) + "\n\tAutocommit mode: " + handleEmpty( autoCommitMode ) + "\n\tIsolation level: " + handleEmpty( isolationLevel ) + + "\n\tPool: " + handleEmpty( connectionProviderClass ) + "\n\tMinimum pool size: " + handleEmpty( poolMinSize ) + "\n\tMaximum pool size: " + handleEmpty( poolMaxSize ); } @@ -127,6 +133,10 @@ private static String handleEmpty(Integer value) { return value != null ? value.toString() : DEFAULT; } + private static String handleEmpty(Class value) { + return value != null ? value.getSimpleName() : DEFAULT; + } + @SuppressWarnings("deprecation") private static String determineUrl(Map settings) { diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java index 547c80de115e..310a6a84ba61 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java @@ -150,6 +150,7 @@ public boolean supportsAggressiveRelease() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + DatasourceConnectionProviderImpl.class, null, null, dialect.getVersion(), diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index b640b51d1007..1aed92862d28 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -142,6 +142,7 @@ private static ConnectionCreator buildCreator( final ConnectionCreatorFactory factory = getConnectionCreatorFactory( configurationValues, serviceRegistry ); dbInfo = new DatabaseConnectionInfoImpl( + DriverManagerConnectionProviderImpl.class, url, driverList, SimpleDatabaseVersion.ZERO_VERSION, @@ -283,6 +284,7 @@ public boolean supportsAggressiveRelease() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + DriverManagerConnectionProviderImpl.class, dbInfo.getJdbcUrl(), dbInfo.getJdbcDriver(), dialect.getVersion(), diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DataSourceBasedMultiTenantConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DataSourceBasedMultiTenantConnectionProviderImpl.java index 4d5357a63831..9f1da9c64d99 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DataSourceBasedMultiTenantConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/DataSourceBasedMultiTenantConnectionProviderImpl.java @@ -72,30 +72,29 @@ private Map dataSourceMap() { public void injectServices(ServiceRegistryImplementor serviceRegistry) { final ConfigurationService configurationService = serviceRegistry.requireService( ConfigurationService.class ); final Object dataSourceConfigValue = configurationService.getSettings().get( DATASOURCE ); - if ( !(dataSourceConfigValue instanceof String) ) { + if ( !(dataSourceConfigValue instanceof String configuredJndiName) ) { throw new HibernateException( "illegal value for configuration setting '" + DATASOURCE + "'" ); } - jndiName = (String) dataSourceConfigValue; + jndiName = configuredJndiName; jndiService = serviceRegistry.getService( JndiService.class ); if ( jndiService == null ) { throw new HibernateException( "Could not locate JndiService from DataSourceBasedMultiTenantConnectionProviderImpl" ); } - final Object namedObject = jndiService.locate( jndiName ); + final Object namedObject = jndiService.locate( this.jndiName ); if ( namedObject == null ) { - throw new HibernateException( "JNDI name [" + jndiName + "] could not be resolved" ); + throw new HibernateException( "JNDI name [" + this.jndiName + "] could not be resolved" ); } - - if ( namedObject instanceof DataSource datasource ) { - final int loc = jndiName.lastIndexOf( '/' ); - baseJndiNamespace = jndiName.substring( 0, loc ); - final String prefix = jndiName.substring(loc + 1); + else if ( namedObject instanceof DataSource datasource ) { + final int loc = this.jndiName.lastIndexOf( '/' ); + baseJndiNamespace = this.jndiName.substring( 0, loc ); + final String prefix = this.jndiName.substring( loc + 1); tenantIdentifierForAny = (T) prefix; dataSourceMap().put( tenantIdentifierForAny, datasource ); } else if ( namedObject instanceof Context ) { - baseJndiNamespace = jndiName; + baseJndiNamespace = this.jndiName; final Object configuredTenantId = configurationService.getSettings().get( TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY ); tenantIdentifierForAny = (T) configuredTenantId; @@ -106,7 +105,7 @@ else if ( namedObject instanceof Context ) { else { throw new HibernateException( "Unknown object type [" + namedObject.getClass().getName() + - "] found in JNDI location [" + jndiName + "]" + "] found in JNDI location [" + this.jndiName + "]" ); } } @@ -119,6 +118,7 @@ public void stop() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + null, null, null, dialect.getVersion(), diff --git a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java index 16ab7c8b777e..1be0ff666846 100644 --- a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java +++ b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java @@ -95,6 +95,7 @@ public boolean supportsAggressiveRelease() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + HikariCPConnectionProvider.class, hikariConfig.getJdbcUrl(), // Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to // the database metadata is allowed diff --git a/hibernate-ucp/src/main/java/org/hibernate/oracleucp/internal/UCPConnectionProvider.java b/hibernate-ucp/src/main/java/org/hibernate/oracleucp/internal/UCPConnectionProvider.java index 871f77192792..7e48bd18bdcc 100644 --- a/hibernate-ucp/src/main/java/org/hibernate/oracleucp/internal/UCPConnectionProvider.java +++ b/hibernate-ucp/src/main/java/org/hibernate/oracleucp/internal/UCPConnectionProvider.java @@ -182,6 +182,7 @@ public boolean supportsAggressiveRelease() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + UCPConnectionProvider.class, ucpDS.getURL(), ucpDS.getConnectionFactoryClassName(), dialect.getVersion(), From 6323d27434b74436de229765ffd05f8eead64647 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Dec 2024 23:03:07 +0100 Subject: [PATCH 2/6] add HibernatePersistenceConfiguration.jdbcPoolSize --- .../jpa/HibernatePersistenceConfiguration.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/HibernatePersistenceConfiguration.java b/hibernate-core/src/main/java/org/hibernate/jpa/HibernatePersistenceConfiguration.java index 0c2a8ed80b79..32aa2d497949 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/HibernatePersistenceConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/HibernatePersistenceConfiguration.java @@ -156,6 +156,16 @@ public HibernatePersistenceConfiguration jdbcCredentials(String username, String return this; } + /** + * The JDBC connection pool size. + * + * @see JdbcSettings#POOL_SIZE + */ + public HibernatePersistenceConfiguration jdbcPoolSize(int poolSize) { + property( JdbcSettings.POOL_SIZE, poolSize ); + return this; + } + /** * Enables SQL logging to the console. *

From 451aa05bdda6d7b03853c02990af080545cadf81 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Dec 2024 23:03:29 +0100 Subject: [PATCH 3/6] update connection pooling docs --- .../asciidoc/introduction/Introduction.adoc | 20 ++++++++----------- .../main/asciidoc/introduction/Tuning.adoc | 7 ++++--- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/documentation/src/main/asciidoc/introduction/Introduction.adoc b/documentation/src/main/asciidoc/introduction/Introduction.adoc index 0d5cbcf9ebdb..220bc62be97d 100644 --- a/documentation/src/main/asciidoc/introduction/Introduction.adoc +++ b/documentation/src/main/asciidoc/introduction/Introduction.adoc @@ -186,23 +186,19 @@ dependencies { // the GOAT ORM implementation 'org.hibernate.orm:hibernate-core:{fullVersion}' + // Hibernate Processor + annotationProcessor 'org.hibernate.orm:hibernate-processor:{fullVersion}' + // Hibernate Validator implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' implementation 'org.glassfish:jakarta.el:4.0.2' // Agroal connection pool - implementation 'org.hibernate.orm:hibernate-agroal:{fullVersion}' - implementation 'io.agroal:agroal-pool:2.1' + runtimeOnly 'org.hibernate.orm:hibernate-agroal:{fullVersion}' + runtimeOnly 'io.agroal:agroal-pool:2.5' // logging via Log4j - implementation 'org.apache.logging.log4j:log4j-core:2.24.1' - - // Hibernate Processor - annotationProcessor 'org.hibernate.orm:hibernate-processor:{fullVersion}' - - // Compile-time checking for HQL - //implementation 'org.hibernate:query-validator:2.0-SNAPSHOT' - //annotationProcessor 'org.hibernate:query-validator:2.0-SNAPSHOT' + runtimeOnly 'org.apache.logging.log4j:log4j-core:2.24.1' // H2 database runtimeOnly 'com.h2database:h2:2.3.232' @@ -281,8 +277,8 @@ public class Main { // use H2 in-memory database .jdbcUrl("jdbc:h2:mem:db1") .jdbcCredentials("sa", "") - // use Agroal connection pool - .property("hibernate.agroal.maxSize", 20) + // set the Agroal connection pool size + .jdbcPoolSize(16) // display SQL in console .showSql(true, true, true) .createEntityManagerFactory(); diff --git a/documentation/src/main/asciidoc/introduction/Tuning.adoc b/documentation/src/main/asciidoc/introduction/Tuning.adoc index 8c6d3a3f2ebb..bd7700f16ff6 100644 --- a/documentation/src/main/asciidoc/introduction/Tuning.adoc +++ b/documentation/src/main/asciidoc/introduction/Tuning.adoc @@ -35,7 +35,9 @@ the connection pool. The connection pool built in to Hibernate is suitable for testing, but isn't intended for use in production. Instead, Hibernate supports several different connection pools, including our favorite, Agroal. -To select and configure Agroal, you'll need to set some extra configuration properties, in addition to the settings we already saw in <>. +Hibernate will automatically make use of `AgroalConnectionProvider` if the module `org.hibernate.orm:hibernate-agroal` is available at runtime. + +To properly configure Agroal, you'll need to set some extra configuration properties, in addition to the settings we already saw in <>. Properties with the prefix `hibernate.agroal` are passed through to Agroal: [source,properties] @@ -47,7 +49,6 @@ hibernate.agroal.acquisitionTimeout PT1s hibernate.agroal.reapTimeout PT10s ---- -As long as you set at least one property with the prefix `hibernate.agroal`, the `AgroalConnectionProvider` will be selected automatically. There are many to choose from, as enumerated by link:{doc-javadoc-url}/org/hibernate/cfg/AgroalSettings.html[`AgroalSettings`]: .Settings for configuring Agroal @@ -78,7 +79,7 @@ The following settings are common to all connection pools supported by Hibernate |=== A popular alternative to Agroal is HikariCP. -Its setting are enumerated by link:{doc-javadoc-url}/org/hibernate/cfg/HikariCPSettings.html[`HikariCPSettings`]. +Its settings are enumerated by link:{doc-javadoc-url}/org/hibernate/cfg/HikariCPSettings.html[`HikariCPSettings`]. .Container-managed datasources **** From 84062a1d78dd5b900a048dd47e4fae8da7ace5b7 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Dec 2024 23:36:35 +0100 Subject: [PATCH 4/6] add a comment about autocommit in Hikari --- .../org/hibernate/c3p0/internal/C3P0ConnectionProvider.java | 4 ++++ .../internal/DriverManagerConnectionProviderImpl.java | 2 +- .../hikaricp/internal/HikariCPConnectionProvider.java | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java index b9e10ed0d872..d41b2f8f423a 100644 --- a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java +++ b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java @@ -144,6 +144,10 @@ public void configure(Map properties) { loadDriverClass( jdbcDriverClass ); + // c3p0 returns Connections with autocommit enabled, but for + // historical reasons we default to calling setAutocommit(false) + // as soon as we obtain a new connection. This maybe isn't ideal, + // and it's not what we do with Agroal or Hikari. autocommit = getBoolean( JdbcSettings.AUTOCOMMIT, properties ); // defaults to false isolation = ConnectionProviderInitiator.extractIsolation( properties ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index 1aed92862d28..0d1d1ca9f334 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -86,7 +86,7 @@ public void configure(Map configurationValues) { } private PooledConnections buildPool(Map configurationValues, ServiceRegistryImplementor serviceRegistry) { - final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); + final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); // default to false final int minSize = ConfigurationHelper.getInt( MIN_SIZE, configurationValues, 1 ); final int maxSize = ConfigurationHelper.getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ); final int initialSize = ConfigurationHelper.getInt( INITIAL_SIZE, configurationValues, minSize ); diff --git a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java index 1be0ff666846..b1f5a25a09cd 100644 --- a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java +++ b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java @@ -97,8 +97,9 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( HikariCPConnectionProvider.class, hikariConfig.getJdbcUrl(), - // Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to - // the database metadata is allowed + // Attempt to resolve the driver name from the dialect, + // in case it wasn't explicitly set and access to the + // database metadata is allowed isBlank( hikariConfig.getDriverClassName() ) ? extractDriverNameFromMetadata() : hikariConfig.getDriverClassName(), From 6ac5cb2c942520923284beeead92d472d72a256a Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Dec 2024 23:36:58 +0100 Subject: [PATCH 5/6] remove unused @Internal methods --- .../c3p0/internal/C3P0ConnectionProvider.java | 10 +++---- .../DriverManagerConnectionProviderImpl.java | 28 ++----------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java index d41b2f8f423a..df3a54284c8f 100644 --- a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java +++ b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java @@ -74,11 +74,11 @@ public class C3P0ConnectionProvider private static final String C3P0_STYLE_MAX_STATEMENTS = "c3p0.maxStatements"; private static final String C3P0_STYLE_ACQUIRE_INCREMENT = "c3p0.acquireIncrement"; private static final String C3P0_STYLE_IDLE_CONNECTION_TEST_PERIOD = "c3p0.idleConnectionTestPeriod"; - - //swaldman 2006-08-28: define c3p0-style configuration parameters for initialPoolSize, which - // hibernate sensibly lets default to minPoolSize, but we'll let users - // override it with the c3p0-style property if they want. + //swaldman 2006-08-28: define c3p0-style configuration parameters for initialPoolSize, + // which hibernate sensibly lets default to minPoolSize, but we'll + // let users override it with the c3p0-style property if they want. private static final String C3P0_STYLE_INITIAL_POOL_SIZE = "c3p0.initialPoolSize"; + private DataSource dataSource; private Integer isolation; private boolean autocommit; @@ -161,7 +161,7 @@ public void configure(Map properties) { jdbcDriverClass, dialect.getVersion(), Boolean.toString( autocommit ), - isolation != null ? ConnectionProviderInitiator.toIsolationNiceName( isolation ) : null, + isolation == null ? null : ConnectionProviderInitiator.toIsolationNiceName( isolation ), requireNonNullElse( getInteger( C3P0_STYLE_MIN_POOL_SIZE.substring( 5 ), poolSettings ), DEFAULT_MIN_POOL_SIZE ), requireNonNullElse( getInteger( C3P0_STYLE_MAX_POOL_SIZE.substring( 5 ), poolSettings ), diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index 0d1d1ca9f334..f4aece082616 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -21,7 +21,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hibernate.HibernateException; -import org.hibernate.Internal; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Database; @@ -338,7 +337,6 @@ public void stop() { } } - //CHECKSTYLE:START_ALLOW_FINALIZER @Override protected void finalize() throws Throwable { if ( state != null ) { @@ -346,26 +344,12 @@ protected void finalize() throws Throwable { } super.finalize(); } - //CHECKSTYLE:END_ALLOW_FINALIZER - - /** - * Exposed to facilitate testing only. - */ - public Properties getConnectionProperties() { - BasicConnectionCreator connectionCreator = (BasicConnectionCreator) this.state.pool.connectionCreator; - return connectionCreator.getConnectionProperties(); - } @Override public boolean isValid(Connection connection) throws SQLException { return true; } - @Internal - public void releasePooledConnections() { - state.pool.releasePooledConnections(); - } - public static class PooledConnections { private final ConcurrentLinkedQueue allConnections = new ConcurrentLinkedQueue<>(); @@ -438,7 +422,7 @@ protected Connection releaseConnection(Connection conn) { return null; } - public Connection poll() throws SQLException { + public Connection poll() { Connection conn; do { conn = availableConnections.poll(); @@ -526,13 +510,6 @@ public String getUrl() { return connectionCreator.getUrl(); } - @Internal - public void releasePooledConnections() { - for ( Connection connection : allConnections ) { - closeConnection( connection, null ); - } - } - public static class Builder { private final ConnectionCreator connectionCreator; private ConnectionValidator connectionValidator; @@ -641,7 +618,7 @@ public void stop() { } } - public Connection getConnection() throws SQLException { + public Connection getConnection() { startIfNeeded(); statelock.readLock().lock(); try { @@ -704,7 +681,6 @@ else if ( e != null ) { } private static class ValidationThreadFactory implements ThreadFactory { - @Override public Thread newThread(Runnable runnable) { Thread thread = new Thread( runnable ); From 6c245f5ef757a4134b2504c12f9cf842844d6cfe Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sun, 22 Dec 2024 00:10:34 +0100 Subject: [PATCH 6/6] make private some internal methods and an inner class --- .../DriverManagerConnectionProviderImpl.java | 70 ++++++++++--------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index f4aece082616..bff9f5e5c8c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -29,7 +29,6 @@ import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException; import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo; -import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.service.UnknownUnwrapTypeException; import org.hibernate.service.spi.Configurable; import org.hibernate.service.spi.ServiceException; @@ -39,6 +38,9 @@ import org.hibernate.internal.log.ConnectionInfoLogger; import static org.hibernate.cfg.JdbcSettings.JAKARTA_JDBC_URL; +import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; +import static org.hibernate.internal.util.config.ConfigurationHelper.getInt; +import static org.hibernate.internal.util.config.ConfigurationHelper.getLong; /** * A connection provider that uses the {@link DriverManager} directly to open connections and provides @@ -80,23 +82,23 @@ public void injectServices(ServiceRegistryImplementor serviceRegistry) { public void configure(Map configurationValues) { ConnectionInfoLogger.INSTANCE.usingHibernateBuiltInConnectionPool(); PooledConnections pool = buildPool( configurationValues, serviceRegistry ); - final long validationInterval = ConfigurationHelper.getLong( VALIDATION_INTERVAL, configurationValues, 30 ); + final long validationInterval = getLong( VALIDATION_INTERVAL, configurationValues, 30 ); this.state = new PoolState( pool, validationInterval ); } private PooledConnections buildPool(Map configurationValues, ServiceRegistryImplementor serviceRegistry) { - final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); // default to false - final int minSize = ConfigurationHelper.getInt( MIN_SIZE, configurationValues, 1 ); - final int maxSize = ConfigurationHelper.getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ); - final int initialSize = ConfigurationHelper.getInt( INITIAL_SIZE, configurationValues, minSize ); + final boolean autoCommit = getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); // default to false + final int minSize = getInt( MIN_SIZE, configurationValues, 1 ); + final int maxSize = getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ); + final int initialSize = getInt( INITIAL_SIZE, configurationValues, minSize ); final ConnectionCreator creator = buildCreator( configurationValues, serviceRegistry ); - final PooledConnections.Builder pooledConnectionBuilder = new PooledConnections.Builder( creator, autoCommit ); - pooledConnectionBuilder.initialSize( initialSize ); - pooledConnectionBuilder.minSize( minSize ); - pooledConnectionBuilder.maxSize( maxSize ); - pooledConnectionBuilder.validator( this ); - return pooledConnectionBuilder.build(); + return new PooledConnections.Builder( creator, autoCommit ) + .initialSize( initialSize ) + .minSize( minSize ) + .maxSize( maxSize ) + .validator( this ) + .build(); } private static ConnectionCreator buildCreator( @@ -134,7 +136,7 @@ private static ConnectionCreator buildCreator( final Properties connectionProps = ConnectionProviderInitiator.getConnectionProperties( configurationValues ); - final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); + final boolean autoCommit = getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues ); final Integer isolation = ConnectionProviderInitiator.extractIsolation( configurationValues ); final String initSql = (String) configurationValues.get( INIT_SQL ); @@ -147,8 +149,8 @@ private static ConnectionCreator buildCreator( SimpleDatabaseVersion.ZERO_VERSION, Boolean.toString( autoCommit ), isolation != null ? ConnectionProviderInitiator.toIsolationNiceName( isolation ) : null, - ConfigurationHelper.getInt( MIN_SIZE, configurationValues, 1 ), - ConfigurationHelper.getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ) + getInt( MIN_SIZE, configurationValues, 1 ), + getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ) ); return factory.create( @@ -234,9 +236,9 @@ private static ConnectionCreatorFactory loadConnectionCreatorFactory( return null; } else if ( serviceRegistry != null ) { - final ClassLoaderService classLoaderService = serviceRegistry.requireService( ClassLoaderService.class ); final Class factoryClass = - classLoaderService.classForName( connectionCreatorFactoryClassName ); + serviceRegistry.requireService( ClassLoaderService.class ) + .classForName( connectionCreatorFactoryClassName ); try { return factoryClass.newInstance(); } @@ -376,7 +378,7 @@ private PooledConnections( addConnections( builder.initialSize ); } - public void validate() { + private void validate() { final int size = size(); if ( !primed && size >= minSize ) { @@ -398,14 +400,14 @@ else if ( size > maxSize ) { } } - public void add(Connection conn) throws SQLException { + private void add(Connection conn) { final Connection connection = releaseConnection( conn ); if ( connection != null ) { availableConnections.offer( connection ); } } - protected Connection releaseConnection(Connection conn) { + private Connection releaseConnection(Connection conn) { Exception t = null; try { conn.setAutoCommit( true ); @@ -422,7 +424,7 @@ protected Connection releaseConnection(Connection conn) { return null; } - public Connection poll() { + private Connection poll() { Connection conn; do { conn = availableConnections.poll(); @@ -510,7 +512,7 @@ public String getUrl() { return connectionCreator.getUrl(); } - public static class Builder { + private static class Builder { private final ConnectionCreator connectionCreator; private ConnectionValidator connectionValidator; private final boolean autoCommit; @@ -518,32 +520,32 @@ public static class Builder { private int minSize = 1; private int maxSize = 20; - public Builder(ConnectionCreator connectionCreator, boolean autoCommit) { + private Builder(ConnectionCreator connectionCreator, boolean autoCommit) { this.connectionCreator = connectionCreator; this.autoCommit = autoCommit; } - public Builder initialSize(int initialSize) { + private Builder initialSize(int initialSize) { this.initialSize = initialSize; return this; } - public Builder minSize(int minSize) { + private Builder minSize(int minSize) { this.minSize = minSize; return this; } - public Builder maxSize(int maxSize) { + private Builder maxSize(int maxSize) { this.maxSize = maxSize; return this; } - public Builder validator(ConnectionValidator connectionValidator) { + private Builder validator(ConnectionValidator connectionValidator) { this.connectionValidator = connectionValidator; return this; } - public PooledConnections build() { + private PooledConnections build() { return new PooledConnections( this ); } } @@ -559,7 +561,7 @@ private static class PoolState implements Runnable { private final PooledConnections pool; private final long validationInterval; - public PoolState(PooledConnections pool, long validationInterval) { + private PoolState(PooledConnections pool, long validationInterval) { this.pool = pool; this.validationInterval = validationInterval; } @@ -594,7 +596,7 @@ public void run() { } } - public void stop() { + private void stop() { statelock.writeLock().lock(); try { if ( !active ) { @@ -618,7 +620,7 @@ public void stop() { } } - public Connection getConnection() { + private Connection getConnection() { startIfNeeded(); statelock.readLock().lock(); try { @@ -629,7 +631,7 @@ public Connection getConnection() { } } - public void closeConnection(Connection conn) throws SQLException { + private void closeConnection(Connection conn) { if (conn == null) { return; } @@ -643,7 +645,7 @@ public void closeConnection(Connection conn) throws SQLException { } } - public void validateConnections(ConnectionValidator validator) { + private void validateConnections(ConnectionValidator validator) { if ( !active ) { return; } @@ -683,7 +685,7 @@ else if ( e != null ) { private static class ValidationThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable runnable) { - Thread thread = new Thread( runnable ); + final Thread thread = new Thread( runnable ); thread.setDaemon( true ); thread.setName( "Hibernate Connection Pool Validation Thread" ); return thread;