From 64d8bca67c5852219a68067e1c52459044b2dcc2 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Tue, 5 Aug 2025 13:27:36 +1000 Subject: [PATCH 1/3] more consistent handling of JDBC driver name in log message --- .../internal/AgroalConnectionProvider.java | 19 ++-------------- .../internal/DatabaseConnectionInfoImpl.java | 9 ++++++++ .../DatasourceConnectionProviderImpl.java | 17 +++++++------- .../DriverManagerConnectionProviderImpl.java | 3 ++- .../TestDataSourceConnectionProvider.java | 6 ++--- .../internal/HikariCPConnectionProvider.java | 22 ++++--------------- 6 files changed, 28 insertions(+), 48 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 f4e9724a01e5..9008ec5f5ab9 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 @@ -40,12 +40,12 @@ import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getCatalog; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getDriverName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getSchema; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasCatalog; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasSchema; -import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess; /** * {@link ConnectionProvider} based on Agroal connection pool. @@ -79,7 +79,6 @@ public class AgroalConnectionProvider implements ConnectionProvider, Configurabl @Serial private static final long serialVersionUID = 1L; private AgroalDataSource agroalDataSource = null; - private boolean isMetadataAccessAllowed = true; // --- Configurable @@ -107,8 +106,6 @@ private static void copyProperty(Map properties, String key, @Override public void configure(Map properties) throws HibernateException { - isMetadataAccessAllowed = allowJdbcMetadataAccess( properties ); - ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Agroal" ); try { final var config = toStringValuedProperties( properties ); @@ -180,7 +177,7 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { // database metadata is allowed connectionConfig.connectionProviderClass() != null ? connectionConfig.connectionProviderClass().toString() - : extractDriverNameFromMetadata(), + : getDriverName( connection ), dialect.getClass(), dialect.getVersion(), hasSchema( connection ), @@ -206,18 +203,6 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { } } - private String extractDriverNameFromMetadata() { - if (isMetadataAccessAllowed) { - try ( Connection conn = getConnection() ) { - return conn.getMetaData().getDriverName(); - } - catch (SQLException e) { - // Do nothing - } - } - return null; - } - @Override public boolean isUnwrappableAs(Class unwrapType) { return ConnectionProvider.class.equals( unwrapType ) 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 5a9d96110b7a..d8464c9a8053 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 @@ -173,6 +173,15 @@ public static Integer getIsolation(Connection connection) { } } + public static String getDriverName(Connection connection) { + try { + return connection.getMetaData().getDriverName(); + } + catch (SQLException e) { + return null; + } + } + @Override public String getJdbcUrl() { return jdbcUrl; 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 d08a465cd607..8e747671c26c 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 @@ -10,7 +10,6 @@ import javax.sql.DataSource; import org.hibernate.HibernateException; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.JdbcSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; @@ -89,9 +88,9 @@ else if ( DataSource.class.isAssignableFrom( unwrapType ) ) { } @Override - public void configure(Map configValues) { + public void configure(Map configuration) { if ( dataSource == null ) { - final Object dataSourceSetting = configValues.get( DATASOURCE ); + final Object dataSourceSetting = configuration.get( DATASOURCE ); if ( dataSourceSetting instanceof DataSource instance ) { dataSource = instance; } @@ -111,17 +110,17 @@ else if ( dataSourceSetting instanceof String jndiName ) { throw new ConnectionProviderConfigurationException( "Unable to determine appropriate DataSource to use" ); } - if ( configValues.containsKey( AvailableSettings.AUTOCOMMIT ) ) { - ConnectionInfoLogger.INSTANCE.ignoredSetting( AvailableSettings.AUTOCOMMIT, + if ( configuration.containsKey( JdbcSettings.AUTOCOMMIT ) ) { + ConnectionInfoLogger.INSTANCE.ignoredSetting( JdbcSettings.AUTOCOMMIT, DatasourceConnectionProviderImpl.class ); } - if ( configValues.containsKey( AvailableSettings.ISOLATION ) ) { - ConnectionInfoLogger.INSTANCE.ignoredSetting( AvailableSettings.ISOLATION, + if ( configuration.containsKey( JdbcSettings.ISOLATION ) ) { + ConnectionInfoLogger.INSTANCE.ignoredSetting( JdbcSettings.ISOLATION, DatasourceConnectionProviderImpl.class ); } - user = (String) configValues.get( AvailableSettings.USER ); - pass = (String) configValues.get( AvailableSettings.PASS ); + user = (String) configuration.get( JdbcSettings.USER ); + pass = (String) configuration.get( JdbcSettings.PASS ); useCredentials = user != null || pass != null; available = true; } 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 b011b96d43e5..35dbcad27f0a 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 @@ -37,6 +37,7 @@ import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.getConnectionProperties; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getCatalog; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getDriverName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getSchema; @@ -124,7 +125,7 @@ private PooledConnections buildPool(Map configuration, ServiceReg dbInfo = new DatabaseConnectionInfoImpl( DriverManagerConnectionProviderImpl.class, url, - driver == null ? null : driver.getClass().getName(), + getDriverName( connection ), null, SimpleDatabaseVersion.ZERO_VERSION, hasSchema( connection ), diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/TestDataSourceConnectionProvider.java b/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/TestDataSourceConnectionProvider.java index c563b1291ff1..e28d11f7ab47 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/TestDataSourceConnectionProvider.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/TestDataSourceConnectionProvider.java @@ -25,8 +25,8 @@ public class TestDataSourceConnectionProvider final DriverManagerConnectionProviderImpl delegate = new DriverManagerConnectionProviderImpl(); @Override - public void configure(Map configValues) { - delegate.configure(configValues); + public void configure(Map configuration) { + delegate.configure( configuration ); setDataSource( new DataSource() { PrintWriter logWriter = new PrintWriter( System.out ); @Override @@ -74,7 +74,7 @@ public Logger getParentLogger() throws SQLFeatureNotSupportedException { throw new SQLFeatureNotSupportedException(); } } ); - super.configure( configValues ); + super.configure( configuration ); } @Override 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 58396f965830..be87de90ce50 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 @@ -26,11 +26,11 @@ import com.zaxxer.hikari.HikariDataSource; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getDriverName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasCatalog; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasSchema; -import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess; import static org.hibernate.hikaricp.internal.HikariConfigurationUtil.loadConfiguration; import static org.hibernate.internal.util.StringHelper.isBlank; @@ -48,7 +48,6 @@ public class HikariCPConnectionProvider implements ConnectionProvider, Configura @Serial private static final long serialVersionUID = -9131625057941275711L; - private boolean isMetadataAccessAllowed = true; /** * HikariCP configuration. @@ -65,11 +64,10 @@ public class HikariCPConnectionProvider implements ConnectionProvider, Configura // ************************************************************************* @Override - public void configure(Map configurationValues) throws HibernateException { + public void configure(Map configuration) throws HibernateException { try { - isMetadataAccessAllowed = allowJdbcMetadataAccess( configurationValues ); ConnectionInfoLogger.INSTANCE.configureConnectionPool( "HikariCP" ); - hikariConfig = loadConfiguration( configurationValues ); + hikariConfig = loadConfiguration( configuration ); hikariDataSource = new HikariDataSource( hikariConfig ); } catch (Exception e) { @@ -108,7 +106,7 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { // in case it wasn't explicitly set and access to the // database metadata is allowed isBlank( hikariConfig.getDriverClassName() ) - ? extractDriverNameFromMetadata() + ? getDriverName( connection ) : hikariConfig.getDriverClassName(), dialect.getClass(), dialect.getVersion(), @@ -134,18 +132,6 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { } } - private String extractDriverNameFromMetadata() { - if ( isMetadataAccessAllowed ) { - try ( Connection conn = getConnection() ) { - return conn.getMetaData().getDriverName(); - } - catch (SQLException e) { - // Do nothing - } - } - return null; - } - @Override public boolean isUnwrappableAs(Class unwrapType) { return ConnectionProvider.class.equals( unwrapType ) From 988db7ff9e6b03e13dd2b0390c40c4373b348eb5 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Tue, 5 Aug 2025 13:47:05 +1000 Subject: [PATCH 2/3] add some missing info to log for Hikari and C3P0 --- .../c3p0/internal/C3P0ConnectionProvider.java | 4 +++- .../hikaricp/internal/HikariCPConnectionProvider.java | 10 ++++++++-- 2 files changed, 11 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 03b55cd1d6f4..77cc27f67e95 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 @@ -45,6 +45,7 @@ import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.getConnectionProperties; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getCatalog; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getDriverName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getSchema; @@ -170,13 +171,14 @@ public void configure(Map properties) { final boolean hasCatalog = hasCatalog( connection ); final String schema = getSchema( connection ); final String catalog = getCatalog( connection ); + final String driverName = getDriverName( connection ); if ( isolation == null ) { isolation = getIsolation( connection ); } dbInfoProducer = dialect -> new DatabaseConnectionInfoImpl( C3P0ConnectionProvider.class, jdbcUrl, - jdbcDriverClass, + driverName, dialect.getClass(), dialect.getVersion(), hasSchema, 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 be87de90ce50..d134e2dc95e2 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 @@ -26,9 +26,11 @@ import com.zaxxer.hikari.HikariDataSource; import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getCatalog; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getDriverName; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getFetchSize; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getIsolation; +import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.getSchema; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasCatalog; import static org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl.hasSchema; import static org.hibernate.hikaricp.internal.HikariConfigurationUtil.loadConfiguration; @@ -112,8 +114,12 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { dialect.getVersion(), hasSchema( connection ), hasCatalog( connection ), - hikariConfig.getSchema(), - hikariConfig.getCatalog(), + hikariConfig.getSchema() != null + ? hikariConfig.getSchema() + : getSchema( connection ), + hikariConfig.getCatalog() != null + ? hikariConfig.getCatalog() + : getCatalog( connection ), Boolean.toString( hikariConfig.isAutoCommit() ), hikariConfig.getTransactionIsolation() != null ? hikariConfig.getTransactionIsolation() From 2498fd608b19f456d0aeb2773c068cd2305e8ad6 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Tue, 5 Aug 2025 13:47:27 +1000 Subject: [PATCH 3/3] fix incorrect metadata call --- .../jdbc/connections/internal/DatabaseConnectionInfoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d8464c9a8053..14e3decac9b4 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 @@ -120,7 +120,7 @@ public DatabaseConnectionInfoImpl(Dialect dialect) { public static boolean hasSchema(Connection connection) { try { - return connection.getMetaData().supportsSchemasInTableDefinitions(); + return connection.getMetaData().supportsSchemasInDataManipulation(); } catch ( SQLException ignored ) { return true;