Skip to content

Commit ee66c43

Browse files
committed
make all connection pools respect hibernate.connection.pool_size
should have done this a long time ago :) also a bunch of refactoring to make connection pool config more robust
1 parent 287d08a commit ee66c43

File tree

11 files changed

+215
-176
lines changed

11 files changed

+215
-176
lines changed

documentation/src/main/asciidoc/introduction/Configuration.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,11 @@ You can set the size of Hibernate's built-in connection pool using this property
355355
|===
356356
| Configuration property name | Purpose
357357

358-
| `hibernate.connection.pool_size` | The size of the built-in connection pool
358+
| `hibernate.connection.pool_size` | The size of the connection pool
359359
|===
360360

361+
This configuration property is also respected when you use Agroal, HikariCP, or c3p0 for connection pooling.
362+
361363
[CAUTION]
362364
// .The default connection pool is not meant for production use
363365
====

documentation/src/main/asciidoc/introduction/Tuning.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ The following settings are common to all connection pools supported by Hibernate
7272
.Common settings for connection pools
7373
[%breakable,cols="37,~"]
7474
|===
75+
| link:{doc-javadoc-url}/org/hibernate/cfg/JdbcSettings.html#POOL_SIZE[`hibernate.connection.pool_size`] | The size of the connection pool
7576
| link:{doc-javadoc-url}/org/hibernate/cfg/JdbcSettings.html#AUTOCOMMIT[`hibernate.connection.autocommit`] | The default autocommit mode
7677
| link:{doc-javadoc-url}/org/hibernate/cfg/JdbcSettings.html#ISOLATION[`hibernate.connection.isolation`] | The default transaction isolation level
7778
|===

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

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
import java.io.Serial;
88
import java.sql.Connection;
99
import java.sql.SQLException;
10-
import java.sql.DatabaseMetaData;
1110
import javax.sql.DataSource;
1211
import java.util.Map;
1312
import java.util.function.Consumer;
1413
import java.util.function.Function;
1514

15+
import io.agroal.api.configuration.AgroalConnectionFactoryConfiguration.TransactionIsolation;
1616
import org.hibernate.HibernateException;
1717
import org.hibernate.cfg.AgroalSettings;
1818
import org.hibernate.cfg.AvailableSettings;
19+
import org.hibernate.cfg.JdbcSettings;
1920
import org.hibernate.dialect.Dialect;
2021
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
2122
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
@@ -35,6 +36,7 @@
3536
import io.agroal.api.security.NamePrincipal;
3637
import io.agroal.api.security.SimplePassword;
3738

39+
import static java.util.function.Function.identity;
3840
import static java.util.stream.Collectors.toMap;
3941
import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX;
4042
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
@@ -77,24 +79,23 @@ public class AgroalConnectionProvider implements ConnectionProvider, Configurabl
7779

7880
private static String extractIsolationAsString(Map<String, Object> properties) {
7981
final Integer isolation = ConnectionProviderInitiator.extractIsolation( properties );
80-
if ( isolation != null ) {
81-
// Agroal resolves transaction isolation from the 'nice' name
82-
return ConnectionProviderInitiator.toIsolationNiceName( isolation );
83-
}
84-
return null;
82+
return isolation != null ?
83+
// Agroal resolves transaction isolation from the 'nice' name
84+
ConnectionProviderInitiator.toIsolationNiceName( isolation )
85+
: null;
8586
}
8687

8788
private static void resolveIsolationSetting(Map<String, Object> properties, AgroalConnectionFactoryConfigurationSupplier cf) {
8889
final String isolationString = extractIsolationAsString( properties );
8990
if ( isolationString != null ) {
90-
cf.jdbcTransactionIsolation( AgroalConnectionFactoryConfiguration.TransactionIsolation.valueOf( isolationString ) );
91+
cf.jdbcTransactionIsolation( TransactionIsolation.valueOf( isolationString ) );
9192
}
9293
}
9394

9495
private static <T> void copyProperty(Map<String, Object> properties, String key, Consumer<T> consumer, Function<String, T> converter) {
9596
final Object value = properties.get( key );
96-
if ( value instanceof String string ) {
97-
consumer.accept( converter.apply( string ) );
97+
if ( value != null ) {
98+
consumer.accept( converter.apply( value.toString() ) );
9899
}
99100
}
100101

@@ -104,14 +105,24 @@ public void configure(Map<String, Object> properties) throws HibernateException
104105

105106
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Agroal" );
106107
try {
107-
final AgroalPropertiesReader agroalProperties = new AgroalPropertiesReader( CONFIG_PREFIX )
108-
.readProperties( toStringValuedProperties( properties ) );
109-
agroalProperties.modify().connectionPoolConfiguration( cp -> cp.connectionFactoryConfiguration( cf -> {
110-
copyProperty( properties, AvailableSettings.DRIVER, cf::connectionProviderClassName, Function.identity() );
111-
copyProperty( properties, AvailableSettings.URL, cf::jdbcUrl, Function.identity() );
112-
copyProperty( properties, AvailableSettings.USER, cf::principal, NamePrincipal::new );
113-
copyProperty( properties, AvailableSettings.PASS, cf::credential, SimplePassword::new );
114-
copyProperty( properties, AvailableSettings.AUTOCOMMIT, cf::autoCommit, Boolean::valueOf );
108+
final Map<String, String> config = toStringValuedProperties( properties );
109+
if ( !properties.containsKey( AgroalSettings.AGROAL_MAX_SIZE ) ) {
110+
final String maxSize =
111+
properties.containsKey( JdbcSettings.POOL_SIZE )
112+
? properties.get( JdbcSettings.POOL_SIZE ).toString()
113+
: String.valueOf( 10 );
114+
config.put( AgroalSettings.AGROAL_MAX_SIZE, maxSize );
115+
}
116+
final AgroalPropertiesReader agroalProperties =
117+
new AgroalPropertiesReader( CONFIG_PREFIX )
118+
.readProperties( config );
119+
agroalProperties.modify()
120+
.connectionPoolConfiguration( cp -> cp.connectionFactoryConfiguration( cf -> {
121+
copyProperty( properties, JdbcSettings.DRIVER, cf::connectionProviderClassName, identity() );
122+
copyProperty( properties, JdbcSettings.URL, cf::jdbcUrl, identity() );
123+
copyProperty( properties, JdbcSettings.USER, cf::principal, NamePrincipal::new );
124+
copyProperty( properties, JdbcSettings.PASS, cf::credential, SimplePassword::new );
125+
copyProperty( properties, JdbcSettings.AUTOCOMMIT, cf::autoCommit, Boolean::valueOf );
115126
resolveIsolationSetting( properties, cf );
116127
return cf;
117128
} ) );
@@ -152,30 +163,31 @@ public boolean supportsAggressiveRelease() {
152163

153164
@Override
154165
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
155-
final AgroalConnectionPoolConfiguration acpc = agroalDataSource.getConfiguration().connectionPoolConfiguration();
166+
final AgroalConnectionPoolConfiguration acpc =
167+
agroalDataSource.getConfiguration().connectionPoolConfiguration();
156168
final AgroalConnectionFactoryConfiguration acfc = acpc.connectionFactoryConfiguration();
157-
158-
159169
return new DatabaseConnectionInfoImpl(
160170
acfc.jdbcUrl(),
161-
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
162-
// the database metadata is allowed
163-
acfc.connectionProviderClass() != null ? acfc.connectionProviderClass().toString() : extractDriverNameFromMetadata(),
171+
// Attempt to resolve the driver name from the dialect,
172+
// in case it wasn't explicitly set and access to the
173+
// database metadata is allowed
174+
acfc.connectionProviderClass() != null
175+
? acfc.connectionProviderClass().toString()
176+
: extractDriverNameFromMetadata(),
164177
dialect.getVersion(),
165178
Boolean.toString( acfc.autoCommit() ),
166179
acfc.jdbcTransactionIsolation() != null
167180
? ConnectionProviderInitiator.toIsolationNiceName( acfc.jdbcTransactionIsolation().level() )
168181
: null,
169182
acpc.minSize(),
170-
acpc.minSize()
183+
acpc.maxSize()
171184
);
172185
}
173186

174187
private String extractDriverNameFromMetadata() {
175188
if (isMetadataAccessAllowed) {
176189
try ( Connection conn = getConnection() ) {
177-
DatabaseMetaData dbmd = conn.getMetaData();
178-
return dbmd.getDriverName();
190+
return conn.getMetaData().getDriverName();
179191
}
180192
catch (SQLException e) {
181193
// Do nothing
@@ -209,8 +221,11 @@ public <T> T unwrap(Class<T> unwrapType) {
209221
@Override
210222
public void stop() {
211223
if ( agroalDataSource != null ) {
212-
ConnectionInfoLogger.INSTANCE.cleaningUpConnectionPool( agroalDataSource.getConfiguration().connectionPoolConfiguration().
213-
connectionFactoryConfiguration().jdbcUrl() );
224+
ConnectionInfoLogger.INSTANCE.cleaningUpConnectionPool(
225+
agroalDataSource.getConfiguration()
226+
.connectionPoolConfiguration()
227+
.connectionFactoryConfiguration()
228+
.jdbcUrl() );
214229
agroalDataSource.close();
215230
}
216231
}

hibernate-agroal/src/main/java/org/hibernate/agroal/internal/package-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
*/
77

88
/**
9-
* Implementation of ConnectionProvider using Agroal.
9+
* Implementation of {@code ConnectionProvider} using Agroal.
1010
*/
1111
package org.hibernate.agroal.internal;

0 commit comments

Comments
 (0)