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-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-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..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; @@ -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..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,11 +26,13 @@ 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.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess; import static org.hibernate.hikaricp.internal.HikariConfigurationUtil.loadConfiguration; import static org.hibernate.internal.util.StringHelper.isBlank; @@ -48,7 +50,6 @@ public class HikariCPConnectionProvider implements ConnectionProvider, Configura @Serial private static final long serialVersionUID = -9131625057941275711L; - private boolean isMetadataAccessAllowed = true; /** * HikariCP configuration. @@ -65,11 +66,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,14 +108,18 @@ 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(), 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() @@ -134,18 +138,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 )