Skip to content

Commit bcac1e3

Browse files
committed
HHH-18669 - resolve the driver name from the connection metadata, in case it wasn't explicitly set and access to the database metadata is allowed
Signed-off-by: Jan Schatteman <[email protected]>
1 parent 3b40e53 commit bcac1e3

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
import java.sql.Connection;
88
import java.sql.SQLException;
9+
import java.sql.DatabaseMetaData;
10+
import javax.sql.DataSource;
911
import java.util.Map;
1012
import java.util.function.Consumer;
1113
import java.util.function.Function;
12-
import javax.sql.DataSource;
1314

1415
import org.hibernate.HibernateException;
1516
import org.hibernate.cfg.AgroalSettings;
@@ -33,6 +34,7 @@
3334
import io.agroal.api.security.SimplePassword;
3435

3536
import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX;
37+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
3638

3739
/**
3840
* ConnectionProvider based on Agroal connection pool
@@ -61,6 +63,7 @@ public class AgroalConnectionProvider implements ConnectionProvider, Configurabl
6163
public static final String CONFIG_PREFIX = AGROAL_CONFIG_PREFIX + ".";
6264
private static final long serialVersionUID = 1L;
6365
private AgroalDataSource agroalDataSource = null;
66+
private boolean isMetadataAccessAllowed = true;
6467

6568
// --- Configurable
6669

@@ -89,6 +92,8 @@ private static <T> void copyProperty(Map<String, Object> properties, String key,
8992

9093
@Override
9194
public void configure(Map<String, Object> props) throws HibernateException {
95+
isMetadataAccessAllowed = allowJdbcMetadataAccess( props );
96+
9297
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Agroal" );
9398
try {
9499
AgroalPropertiesReader agroalProperties = new AgroalPropertiesReader( CONFIG_PREFIX )
@@ -136,9 +141,12 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
136141
final AgroalConnectionPoolConfiguration acpc = agroalDataSource.getConfiguration().connectionPoolConfiguration();
137142
final AgroalConnectionFactoryConfiguration acfc = acpc.connectionFactoryConfiguration();
138143

144+
139145
return new DatabaseConnectionInfoImpl(
140146
acfc.jdbcUrl(),
141-
acfc.connectionProviderClass().toString(),
147+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
148+
// the database metadata is allowed
149+
acfc.connectionProviderClass() != null ? acfc.connectionProviderClass().toString() : extractDriverNameFromMetadata(),
142150
dialect.getVersion(),
143151
Boolean.toString( acfc.autoCommit() ),
144152
acfc.jdbcTransactionIsolation() != null
@@ -149,6 +157,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
149157
);
150158
}
151159

160+
private String extractDriverNameFromMetadata() {
161+
if (isMetadataAccessAllowed) {
162+
try ( Connection conn = getConnection() ) {
163+
DatabaseMetaData dbmd = conn.getMetaData();
164+
return dbmd.getDriverName();
165+
}
166+
catch (SQLException e) {
167+
// Do nothing
168+
}
169+
}
170+
return null;
171+
}
172+
152173
@Override
153174
public boolean isUnwrappableAs(Class<?> unwrapType) {
154175
return ConnectionProvider.class.equals( unwrapType )

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ private static JdbcEnvironmentImpl getJdbcEnvironmentWithExplicitConfiguration(
216216
*
217217
* @see JdbcSettings#ALLOW_METADATA_ON_BOOT
218218
*/
219-
private static boolean allowJdbcMetadataAccess(Map<String, Object> configurationValues) {
219+
public static boolean allowJdbcMetadataAccess(Map<String, Object> configurationValues) {
220220
final Boolean allow = getBooleanWrapper( ALLOW_METADATA_ON_BOOT, configurationValues, null );
221221
if ( allow != null ) {
222222
return allow;

hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,27 @@
55
package org.hibernate.hikaricp.internal;
66

77
import java.sql.Connection;
8+
import java.sql.DatabaseMetaData;
89
import java.sql.SQLException;
9-
import java.util.Map;
1010
import javax.sql.DataSource;
11+
import java.util.Map;
1112

1213
import org.hibernate.HibernateException;
1314
import org.hibernate.dialect.Dialect;
1415
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
1516
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1617
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
1718
import org.hibernate.internal.log.ConnectionInfoLogger;
19+
import org.hibernate.internal.util.StringHelper;
1820
import org.hibernate.service.UnknownUnwrapTypeException;
1921
import org.hibernate.service.spi.Configurable;
2022
import org.hibernate.service.spi.Stoppable;
2123

2224
import com.zaxxer.hikari.HikariConfig;
2325
import com.zaxxer.hikari.HikariDataSource;
2426

27+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
28+
2529
/**
2630
* HikariCP Connection provider for Hibernate.
2731
*
@@ -31,6 +35,7 @@
3135
public class HikariCPConnectionProvider implements ConnectionProvider, Configurable, Stoppable {
3236

3337
private static final long serialVersionUID = -9131625057941275711L;
38+
private boolean isMetadataAccessAllowed = true;
3439

3540
/**
3641
* HikariCP configuration.
@@ -49,6 +54,8 @@ public class HikariCPConnectionProvider implements ConnectionProvider, Configura
4954
@Override
5055
public void configure(Map<String, Object> props) throws HibernateException {
5156
try {
57+
isMetadataAccessAllowed = allowJdbcMetadataAccess( props );
58+
5259
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "HikariCP" );
5360

5461
hcfg = HikariConfigurationUtil.loadConfiguration( props );
@@ -83,7 +90,9 @@ public boolean supportsAggressiveRelease() {
8390
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
8491
return new DatabaseConnectionInfoImpl(
8592
hcfg.getJdbcUrl(),
86-
hcfg.getDriverClassName(),
93+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
94+
// the database metadata is allowed
95+
!StringHelper.isBlank( hcfg.getDriverClassName() ) ? hcfg.getDriverClassName() : extractDriverNameFromMetadata(),
8796
dialect.getVersion(),
8897
Boolean.toString( hcfg.isAutoCommit() ),
8998
hcfg.getTransactionIsolation(),
@@ -92,6 +101,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
92101
);
93102
}
94103

104+
private String extractDriverNameFromMetadata() {
105+
if (isMetadataAccessAllowed) {
106+
try ( Connection conn = getConnection() ) {
107+
DatabaseMetaData dbmd = conn.getMetaData();
108+
return dbmd.getDriverName();
109+
}
110+
catch (SQLException e) {
111+
// Do nothing
112+
}
113+
}
114+
return null;
115+
}
116+
95117
@Override
96118
public boolean isUnwrappableAs(Class<?> unwrapType) {
97119
return ConnectionProvider.class.equals( unwrapType )

hibernate-vibur/src/main/java/org/hibernate/vibur/internal/ViburDBCPConnectionProvider.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.vibur.internal;
66

77
import java.sql.Connection;
8+
import java.sql.DatabaseMetaData;
89
import java.sql.SQLException;
910
import java.util.Map;
1011
import java.util.Properties;
@@ -14,6 +15,7 @@
1415
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1516
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
1617
import org.hibernate.internal.log.ConnectionInfoLogger;
18+
import org.hibernate.internal.util.StringHelper;
1719
import org.hibernate.service.UnknownUnwrapTypeException;
1820
import org.hibernate.service.spi.Configurable;
1921
import org.hibernate.service.spi.Stoppable;
@@ -26,6 +28,7 @@
2628
import static org.hibernate.cfg.AvailableSettings.PASS;
2729
import static org.hibernate.cfg.AvailableSettings.URL;
2830
import static org.hibernate.cfg.AvailableSettings.USER;
31+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
2932

3033
/**
3134
* <p>ViburDBCP connection provider for Hibernate integration.
@@ -57,9 +60,12 @@ public class ViburDBCPConnectionProvider implements ConnectionProvider, Configur
5760
private static final String VIBUR_PREFIX = VIBUR_CONFIG_PREFIX + ".";
5861

5962
private ViburDBCPDataSource dataSource = null;
63+
private boolean isMetadataAccessAllowed = true;
6064

6165
@Override
6266
public void configure(Map<String, Object> configurationValues) {
67+
isMetadataAccessAllowed = allowJdbcMetadataAccess( configurationValues );
68+
6369
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Vibur" );
6470

6571
dataSource = new ViburDBCPDataSource( transform( configurationValues ) );
@@ -94,7 +100,9 @@ public boolean supportsAggressiveRelease() {
94100
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
95101
return new DatabaseConnectionInfoImpl(
96102
dataSource.getJdbcUrl(),
97-
dataSource.getDriverClassName(),
103+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
104+
// the database metadata is allowed
105+
!StringHelper.isBlank( dataSource.getDriverClassName() ) ? dataSource.getDriverClassName() : extractDriverNameFromMetadata(),
98106
dialect.getVersion(),
99107
String.valueOf( dataSource.getDefaultAutoCommit() ),
100108
dataSource.getDefaultTransactionIsolation(),
@@ -103,6 +111,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
103111
);
104112
}
105113

114+
private String extractDriverNameFromMetadata() {
115+
if (isMetadataAccessAllowed) {
116+
try ( Connection conn = getConnection() ) {
117+
DatabaseMetaData dbmd = conn.getMetaData();
118+
return dbmd.getDriverName();
119+
}
120+
catch (SQLException e) {
121+
// Do nothing
122+
}
123+
}
124+
return null;
125+
}
126+
106127
@Override
107128
public boolean isUnwrappableAs(Class<?> unwrapType) {
108129
return ConnectionProvider.class.equals( unwrapType )

0 commit comments

Comments
 (0)