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 **** 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..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; @@ -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 ); @@ -152,11 +156,12 @@ public void configure(Map properties) { dataSource = createDataSource( jdbcUrl, connectionProps, poolSettings ); dbInfoProducer = dialect -> new DatabaseConnectionInfoImpl( + C3P0ConnectionProvider.class, jdbcUrl, 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/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..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 @@ -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; @@ -30,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; @@ -40,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 @@ -81,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 ); - 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( @@ -135,20 +136,21 @@ 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 ); final ConnectionCreatorFactory factory = getConnectionCreatorFactory( configurationValues, serviceRegistry ); dbInfo = new DatabaseConnectionInfoImpl( + DriverManagerConnectionProviderImpl.class, url, driverList, 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(); } @@ -283,6 +285,7 @@ public boolean supportsAggressiveRelease() { @Override public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { return new DatabaseConnectionInfoImpl( + DriverManagerConnectionProviderImpl.class, dbInfo.getJdbcUrl(), dbInfo.getJdbcDriver(), dialect.getVersion(), @@ -336,7 +339,6 @@ public void stop() { } } - //CHECKSTYLE:START_ALLOW_FINALIZER @Override protected void finalize() throws Throwable { if ( state != null ) { @@ -344,26 +346,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<>(); @@ -390,7 +378,7 @@ private PooledConnections( addConnections( builder.initialSize ); } - public void validate() { + private void validate() { final int size = size(); if ( !primed && size >= minSize ) { @@ -412,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 ); @@ -436,7 +424,7 @@ protected Connection releaseConnection(Connection conn) { return null; } - public Connection poll() throws SQLException { + private Connection poll() { Connection conn; do { conn = availableConnections.poll(); @@ -524,14 +512,7 @@ public String getUrl() { return connectionCreator.getUrl(); } - @Internal - public void releasePooledConnections() { - for ( Connection connection : allConnections ) { - closeConnection( connection, null ); - } - } - - public static class Builder { + private static class Builder { private final ConnectionCreator connectionCreator; private ConnectionValidator connectionValidator; private final boolean autoCommit; @@ -539,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 ); } } @@ -580,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; } @@ -615,7 +596,7 @@ public void run() { } } - public void stop() { + private void stop() { statelock.writeLock().lock(); try { if ( !active ) { @@ -639,7 +620,7 @@ public void stop() { } } - public Connection getConnection() throws SQLException { + private Connection getConnection() { startIfNeeded(); statelock.readLock().lock(); try { @@ -650,7 +631,7 @@ public Connection getConnection() throws SQLException { } } - public void closeConnection(Connection conn) throws SQLException { + private void closeConnection(Connection conn) { if (conn == null) { return; } @@ -664,7 +645,7 @@ public void closeConnection(Connection conn) throws SQLException { } } - public void validateConnections(ConnectionValidator validator) { + private void validateConnections(ConnectionValidator validator) { if ( !active ) { return; } @@ -702,10 +683,9 @@ 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; 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-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. *

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..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 @@ -95,9 +95,11 @@ 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 + // 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(), 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(),