Skip to content

Commit d702496

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 2d13afb commit d702496

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
@@ -9,10 +9,11 @@
99

1010
import java.sql.Connection;
1111
import java.sql.SQLException;
12+
import java.sql.DatabaseMetaData;
13+
import javax.sql.DataSource;
1214
import java.util.Map;
1315
import java.util.function.Consumer;
1416
import java.util.function.Function;
15-
import javax.sql.DataSource;
1617

1718
import org.hibernate.HibernateException;
1819
import org.hibernate.cfg.AgroalSettings;
@@ -36,6 +37,7 @@
3637
import io.agroal.api.security.SimplePassword;
3738

3839
import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX;
40+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
3941

4042
/**
4143
* ConnectionProvider based on Agroal connection pool
@@ -64,6 +66,7 @@ public class AgroalConnectionProvider implements ConnectionProvider, Configurabl
6466
public static final String CONFIG_PREFIX = AGROAL_CONFIG_PREFIX + ".";
6567
private static final long serialVersionUID = 1L;
6668
private AgroalDataSource agroalDataSource = null;
69+
private boolean isMetadataAccessAllowed = true;
6770

6871
// --- Configurable
6972

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

9396
@Override
9497
public void configure(Map<String, Object> props) throws HibernateException {
98+
isMetadataAccessAllowed = allowJdbcMetadataAccess( props );
99+
95100
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Agroal" );
96101
try {
97102
AgroalPropertiesReader agroalProperties = new AgroalPropertiesReader( CONFIG_PREFIX )
@@ -139,9 +144,12 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
139144
final AgroalConnectionPoolConfiguration acpc = agroalDataSource.getConfiguration().connectionPoolConfiguration();
140145
final AgroalConnectionFactoryConfiguration acfc = acpc.connectionFactoryConfiguration();
141146

147+
142148
return new DatabaseConnectionInfoImpl(
143149
acfc.jdbcUrl(),
144-
acfc.connectionProviderClass().toString(),
150+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
151+
// the database metadata is allowed
152+
acfc.connectionProviderClass() != null ? acfc.connectionProviderClass().toString() : extractDriverNameFromMetadata(),
145153
dialect.getVersion(),
146154
Boolean.toString( acfc.autoCommit() ),
147155
acfc.jdbcTransactionIsolation() != null
@@ -152,6 +160,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
152160
);
153161
}
154162

163+
private String extractDriverNameFromMetadata() {
164+
if (isMetadataAccessAllowed) {
165+
try ( Connection conn = getConnection() ) {
166+
DatabaseMetaData dbmd = conn.getMetaData();
167+
return dbmd.getDriverName();
168+
}
169+
catch (SQLException e) {
170+
// Do nothing
171+
}
172+
}
173+
return null;
174+
}
175+
155176
@Override
156177
public boolean isUnwrappableAs(Class<?> unwrapType) {
157178
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
@@ -215,7 +215,7 @@ private static JdbcEnvironmentImpl getJdbcEnvironmentWithExplicitConfiguration(
215215
*
216216
* @see JdbcSettings#ALLOW_METADATA_ON_BOOT
217217
*/
218-
private static boolean allowJdbcMetadataAccess(Map<String, Object> configurationValues) {
218+
public static boolean allowJdbcMetadataAccess(Map<String, Object> configurationValues) {
219219
final Boolean allow = getBooleanWrapper( ALLOW_METADATA_ON_BOOT, configurationValues, null );
220220
if ( allow != null ) {
221221
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
@@ -8,23 +8,27 @@
88
package org.hibernate.hikaricp.internal;
99

1010
import java.sql.Connection;
11+
import java.sql.DatabaseMetaData;
1112
import java.sql.SQLException;
12-
import java.util.Map;
1313
import javax.sql.DataSource;
14+
import java.util.Map;
1415

1516
import org.hibernate.HibernateException;
1617
import org.hibernate.dialect.Dialect;
1718
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
1819
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1920
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
2021
import org.hibernate.internal.log.ConnectionInfoLogger;
22+
import org.hibernate.internal.util.StringHelper;
2123
import org.hibernate.service.UnknownUnwrapTypeException;
2224
import org.hibernate.service.spi.Configurable;
2325
import org.hibernate.service.spi.Stoppable;
2426

2527
import com.zaxxer.hikari.HikariConfig;
2628
import com.zaxxer.hikari.HikariDataSource;
2729

30+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
31+
2832
/**
2933
* HikariCP Connection provider for Hibernate.
3034
*
@@ -34,6 +38,7 @@
3438
public class HikariCPConnectionProvider implements ConnectionProvider, Configurable, Stoppable {
3539

3640
private static final long serialVersionUID = -9131625057941275711L;
41+
private boolean isMetadataAccessAllowed = true;
3742

3843
/**
3944
* HikariCP configuration.
@@ -52,6 +57,8 @@ public class HikariCPConnectionProvider implements ConnectionProvider, Configura
5257
@Override
5358
public void configure(Map<String, Object> props) throws HibernateException {
5459
try {
60+
isMetadataAccessAllowed = allowJdbcMetadataAccess( props );
61+
5562
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "HikariCP" );
5663

5764
hcfg = HikariConfigurationUtil.loadConfiguration( props );
@@ -86,7 +93,9 @@ public boolean supportsAggressiveRelease() {
8693
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
8794
return new DatabaseConnectionInfoImpl(
8895
hcfg.getJdbcUrl(),
89-
hcfg.getDriverClassName(),
96+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
97+
// the database metadata is allowed
98+
!StringHelper.isBlank( hcfg.getDriverClassName() ) ? hcfg.getDriverClassName() : extractDriverNameFromMetadata(),
9099
dialect.getVersion(),
91100
Boolean.toString( hcfg.isAutoCommit() ),
92101
hcfg.getTransactionIsolation(),
@@ -95,6 +104,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
95104
);
96105
}
97106

107+
private String extractDriverNameFromMetadata() {
108+
if (isMetadataAccessAllowed) {
109+
try ( Connection conn = getConnection() ) {
110+
DatabaseMetaData dbmd = conn.getMetaData();
111+
return dbmd.getDriverName();
112+
}
113+
catch (SQLException e) {
114+
// Do nothing
115+
}
116+
}
117+
return null;
118+
}
119+
98120
@Override
99121
public boolean isUnwrappableAs(Class<?> unwrapType) {
100122
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
@@ -8,6 +8,7 @@
88
package org.hibernate.vibur.internal;
99

1010
import java.sql.Connection;
11+
import java.sql.DatabaseMetaData;
1112
import java.sql.SQLException;
1213
import java.util.Map;
1314
import java.util.Properties;
@@ -17,6 +18,7 @@
1718
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1819
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
1920
import org.hibernate.internal.log.ConnectionInfoLogger;
21+
import org.hibernate.internal.util.StringHelper;
2022
import org.hibernate.service.UnknownUnwrapTypeException;
2123
import org.hibernate.service.spi.Configurable;
2224
import org.hibernate.service.spi.Stoppable;
@@ -29,6 +31,7 @@
2931
import static org.hibernate.cfg.AvailableSettings.PASS;
3032
import static org.hibernate.cfg.AvailableSettings.URL;
3133
import static org.hibernate.cfg.AvailableSettings.USER;
34+
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.allowJdbcMetadataAccess;
3235

3336
/**
3437
* <p>ViburDBCP connection provider for Hibernate integration.
@@ -60,9 +63,12 @@ public class ViburDBCPConnectionProvider implements ConnectionProvider, Configur
6063
private static final String VIBUR_PREFIX = VIBUR_CONFIG_PREFIX + ".";
6164

6265
private ViburDBCPDataSource dataSource = null;
66+
private boolean isMetadataAccessAllowed = true;
6367

6468
@Override
6569
public void configure(Map<String, Object> configurationValues) {
70+
isMetadataAccessAllowed = allowJdbcMetadataAccess( configurationValues );
71+
6672
ConnectionInfoLogger.INSTANCE.configureConnectionPool( "Vibur" );
6773

6874
dataSource = new ViburDBCPDataSource( transform( configurationValues ) );
@@ -97,7 +103,9 @@ public boolean supportsAggressiveRelease() {
97103
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
98104
return new DatabaseConnectionInfoImpl(
99105
dataSource.getJdbcUrl(),
100-
dataSource.getDriverClassName(),
106+
// Attempt to resolve the driver name from the dialect, in case it wasn't explicitly set and access to
107+
// the database metadata is allowed
108+
!StringHelper.isBlank( dataSource.getDriverClassName() ) ? dataSource.getDriverClassName() : extractDriverNameFromMetadata(),
101109
dialect.getVersion(),
102110
String.valueOf( dataSource.getDefaultAutoCommit() ),
103111
dataSource.getDefaultTransactionIsolation(),
@@ -106,6 +114,19 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
106114
);
107115
}
108116

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

0 commit comments

Comments
 (0)