Skip to content

Commit 6f8ba34

Browse files
committed
HHH-18989 log more info when DataSource is used
get it from the DatabaseMetaData
1 parent 560d51c commit 6f8ba34

File tree

9 files changed

+169
-29
lines changed

9 files changed

+169
-29
lines changed

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1717
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
1818
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
19+
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
1920
import org.hibernate.engine.jndi.spi.JndiService;
2021
import org.hibernate.internal.log.ConnectionInfoLogger;
2122
import org.hibernate.service.UnknownUnwrapTypeException;
@@ -24,6 +25,7 @@
2425
import org.hibernate.service.spi.Stoppable;
2526

2627
import static org.hibernate.cfg.JdbcSettings.DATASOURCE;
28+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
2729

2830
/**
2931
* A {@link ConnectionProvider} that manages connections from an underlying {@link DataSource}.
@@ -40,6 +42,7 @@
4042
* @author Steve Ebersole
4143
*/
4244
public class DatasourceConnectionProviderImpl implements ConnectionProvider, Configurable, Stoppable {
45+
4346
private DataSource dataSource;
4447
private String user;
4548
private String pass;
@@ -149,13 +152,33 @@ public boolean supportsAggressiveRelease() {
149152

150153
@Override
151154
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
155+
return getDatabaseConnectionInfo( dialect, null );
156+
}
157+
158+
@Override
159+
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
160+
final String url;
161+
final String driver;
162+
final String isolationLevel;
163+
if ( metaData != null ) {
164+
url = metaData.getUrl();
165+
driver = metaData.getDriver();
166+
isolationLevel = toIsolationNiceName( metaData.getTransactionIsolation() )
167+
+ " [default " + toIsolationNiceName( metaData.getDefaultTransactionIsolation() ) + "]";
168+
}
169+
else {
170+
url = null;
171+
driver = null;
172+
isolationLevel = null;
173+
}
174+
152175
return new DatabaseConnectionInfoImpl(
153176
DatasourceConnectionProviderImpl.class,
154-
null,
155-
null,
177+
url,
178+
driver,
156179
dialect.getVersion(),
157180
null,
158-
null,
181+
isolationLevel,
159182
null,
160183
null
161184
) {

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.hibernate.internal.log.ConnectionInfoLogger;
3939

4040
import static org.hibernate.cfg.JdbcSettings.JAKARTA_JDBC_URL;
41+
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
4142
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
4243
import static org.hibernate.internal.util.config.ConfigurationHelper.getInt;
4344
import static org.hibernate.internal.util.config.ConfigurationHelper.getLong;
@@ -148,7 +149,7 @@ private static ConnectionCreator buildCreator(
148149
driverList,
149150
SimpleDatabaseVersion.ZERO_VERSION,
150151
Boolean.toString( autoCommit ),
151-
isolation != null ? ConnectionProviderInitiator.toIsolationNiceName( isolation ) : null,
152+
isolation != null ? toIsolationNiceName( isolation ) : null,
152153
getInt( MIN_SIZE, configurationValues, 1 ),
153154
getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 )
154155
);

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/spi/ConnectionProvider.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.hibernate.dialect.Dialect;
1111
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
12+
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
1213
import org.hibernate.service.Service;
1314
import org.hibernate.service.spi.Wrapped;
1415

@@ -71,8 +72,21 @@ public interface ConnectionProvider extends Service, Wrapped {
7172
*/
7273
boolean supportsAggressiveRelease();
7374

75+
/**
76+
* @return an informative instance of {@link DatabaseConnectionInfo} for logging.
77+
*
78+
* @since 6.6
79+
*/
7480
default DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
7581
return new DatabaseConnectionInfoImpl( dialect );
7682
}
7783

84+
/**
85+
* @return an informative instance of {@link DatabaseConnectionInfo} for logging.
86+
*
87+
* @since 7.0
88+
*/
89+
default DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
90+
return getDatabaseConnectionInfo( dialect );
91+
}
7892
}

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
4444
private final boolean supportsDataDefinitionInTransaction;
4545
private final boolean doesDataDefinitionCauseTransactionCommit;
4646
private final SQLStateType sqlStateType;
47+
private final int transactionIsolation;
48+
private final int defaultTransactionIsolation;
49+
private final String url;
50+
private final String driver;
4751
private final boolean jdbcMetadataAccessible;
4852

4953

@@ -65,6 +69,10 @@ private ExtractedDatabaseMetaDataImpl(
6569
boolean supportsDataDefinitionInTransaction,
6670
boolean doesDataDefinitionCauseTransactionCommit,
6771
SQLStateType sqlStateType,
72+
int transactionIsolation,
73+
int defaultTransactionIsolation,
74+
String url,
75+
String driver,
6876
boolean jdbcMetadataIsAccessible) {
6977
this.jdbcEnvironment = jdbcEnvironment;
7078
this.connectionAccess = connectionAccess;
@@ -78,6 +86,10 @@ private ExtractedDatabaseMetaDataImpl(
7886
this.supportsDataDefinitionInTransaction = supportsDataDefinitionInTransaction;
7987
this.doesDataDefinitionCauseTransactionCommit = doesDataDefinitionCauseTransactionCommit;
8088
this.sqlStateType = sqlStateType;
89+
this.transactionIsolation = transactionIsolation;
90+
this.defaultTransactionIsolation = defaultTransactionIsolation;
91+
this.url = url;
92+
this.driver = driver;
8193
this.jdbcMetadataAccessible = jdbcMetadataIsAccessible;
8294
}
8395

@@ -136,6 +148,26 @@ public String getConnectionSchemaName() {
136148
return connectionSchemaName;
137149
}
138150

151+
@Override
152+
public String getUrl() {
153+
return url;
154+
}
155+
156+
@Override
157+
public String getDriver() {
158+
return driver;
159+
}
160+
161+
@Override
162+
public int getTransactionIsolation() {
163+
return transactionIsolation;
164+
}
165+
166+
@Override
167+
public int getDefaultTransactionIsolation() {
168+
return defaultTransactionIsolation;
169+
}
170+
139171
@Override
140172
public synchronized List<SequenceInformation> getSequenceInformationList() {
141173
if ( jdbcMetadataAccessible ) {
@@ -175,6 +207,10 @@ public static class Builder {
175207
private boolean supportsDataDefinitionInTransaction;
176208
private boolean doesDataDefinitionCauseTransactionCommit;
177209
private SQLStateType sqlStateType;
210+
private String url;
211+
private String driver;
212+
private int defaultTransactionIsolation;
213+
private int transactionIsolation;
178214

179215
public Builder(JdbcEnvironment jdbcEnvironment, boolean jdbcMetadataIsAccessible, JdbcConnectionAccess connectionAccess) {
180216
this.jdbcEnvironment = jdbcEnvironment;
@@ -193,6 +229,10 @@ public Builder apply(DatabaseMetaData databaseMetaData) throws SQLException {
193229
supportsDataDefinitionInTransaction = !databaseMetaData.dataDefinitionIgnoredInTransactions();
194230
doesDataDefinitionCauseTransactionCommit = databaseMetaData.dataDefinitionCausesTransactionCommit();
195231
sqlStateType = SQLStateType.interpretReportedSQLStateType( databaseMetaData.getSQLStateType() );
232+
url = databaseMetaData.getURL();
233+
driver = databaseMetaData.getDriverName();
234+
defaultTransactionIsolation = databaseMetaData.getDefaultTransactionIsolation();
235+
transactionIsolation = databaseMetaData.getConnection().getTransactionIsolation();
196236
return this;
197237
}
198238

@@ -260,6 +300,10 @@ public ExtractedDatabaseMetaDataImpl build() {
260300
supportsDataDefinitionInTransaction,
261301
doesDataDefinitionCauseTransactionCommit,
262302
sqlStateType,
303+
transactionIsolation,
304+
defaultTransactionIsolation,
305+
url,
306+
driver,
263307
jdbcMetadataIsAccessible
264308
);
265309
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ public JdbcEnvironmentImpl(final ServiceRegistryImplementor serviceRegistry, fin
8686
final IdentifierHelperBuilder identifierHelperBuilder =
8787
identifierHelperBuilder( cfgService, nameQualifierSupport );
8888

89-
final ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder =
89+
final ExtractedDatabaseMetaDataImpl.Builder metaDataBuilder =
9090
new ExtractedDatabaseMetaDataImpl.Builder( this, false, null );
9191

92-
this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, dbMetaDataBuilder );;
92+
this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, metaDataBuilder );;
9393

94-
this.extractedMetaDataSupport = dbMetaDataBuilder.build();
94+
this.extractedMetaDataSupport = metaDataBuilder.build();
9595

9696
this.currentCatalog = identifierHelper.toIdentifier(
9797
cfgService.getSetting( AvailableSettings.DEFAULT_CATALOG, StandardConverters.STRING )

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

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050

5151
import org.jboss.logging.Logger;
5252

53+
import static java.lang.Integer.parseInt;
5354
import static org.hibernate.cfg.AvailableSettings.CONNECTION_HANDLING;
5455
import static org.hibernate.cfg.AvailableSettings.DIALECT_DB_MAJOR_VERSION;
5556
import static org.hibernate.cfg.AvailableSettings.DIALECT_DB_MINOR_VERSION;
@@ -69,6 +70,7 @@
6970
import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
7071
import static org.hibernate.internal.util.NullnessHelper.coalesceSuppliedValues;
7172
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
73+
import static org.hibernate.internal.util.StringHelper.split;
7274
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
7375
import static org.hibernate.internal.util.config.ConfigurationHelper.getBooleanWrapper;
7476
import static org.hibernate.internal.util.config.ConfigurationHelper.getInteger;
@@ -100,8 +102,6 @@ public Class<JdbcEnvironment> getServiceInitiated() {
100102

101103
@Override
102104
public JdbcEnvironment initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
103-
final DialectFactory dialectFactory = registry.requireService( DialectFactory.class );
104-
105105
final String explicitDatabaseName = getExplicitDatabaseName( configurationValues );
106106
Integer explicitDatabaseMajorVersion = getExplicitDatabaseMajorVersion( configurationValues );
107107
Integer explicitDatabaseMinorVersion = getExplicitDatabaseMinorVersion( configurationValues );
@@ -110,11 +110,11 @@ public JdbcEnvironment initiateService(Map<String, Object> configurationValues,
110110
getExplicitDatabaseVersion( configurationValues, explicitDatabaseMajorVersion, explicitDatabaseMinorVersion );
111111

112112
if ( explicitDatabaseMajorVersion == null && explicitDatabaseMinorVersion == null && explicitDatabaseVersion != null ) {
113-
final String[] parts = StringHelper.split( ".", explicitDatabaseVersion );
113+
final String[] parts = split( ".", explicitDatabaseVersion );
114114
try {
115-
final int potentialMajor = Integer.parseInt( parts[0] );
115+
final int potentialMajor = parseInt( parts[0] );
116116
if ( parts.length > 1 ) {
117-
explicitDatabaseMinorVersion = Integer.parseInt( parts[1] );
117+
explicitDatabaseMinorVersion = parseInt( parts[1] );
118118
}
119119
explicitDatabaseMajorVersion = potentialMajor;
120120
}
@@ -123,8 +123,27 @@ public JdbcEnvironment initiateService(Map<String, Object> configurationValues,
123123
}
124124
}
125125

126+
return getJdbcEnvironment(
127+
configurationValues,
128+
registry,
129+
explicitDatabaseName,
130+
explicitDatabaseMajorVersion,
131+
explicitDatabaseMinorVersion,
132+
explicitDatabaseVersion
133+
);
134+
}
135+
136+
private JdbcEnvironment getJdbcEnvironment(
137+
Map<String, Object> configurationValues,
138+
ServiceRegistryImplementor registry,
139+
String explicitDatabaseName,
140+
Integer explicitDatabaseMajorVersion,
141+
Integer explicitDatabaseMinorVersion,
142+
String explicitDatabaseVersion) {
143+
final DialectFactory dialectFactory = registry.requireService( DialectFactory.class );
144+
126145
final JdbcEnvironment jdbcEnvironment;
127-
DatabaseConnectionInfo databaseConnectionInfo;
146+
final DatabaseConnectionInfo databaseConnectionInfo;
128147
if ( allowJdbcMetadataAccess( configurationValues ) ) {
129148
jdbcEnvironment = getJdbcEnvironmentUsingJdbcMetadata(
130149
configurationValues,
@@ -133,8 +152,9 @@ public JdbcEnvironment initiateService(Map<String, Object> configurationValues,
133152
explicitDatabaseName,
134153
explicitDatabaseMajorVersion,
135154
explicitDatabaseMinorVersion,
136-
explicitDatabaseVersion);
137-
databaseConnectionInfo = buildDbInfo( registry, jdbcEnvironment.getDialect() );
155+
explicitDatabaseVersion
156+
);
157+
databaseConnectionInfo = buildInfo( registry, jdbcEnvironment );
138158
}
139159
else if ( explicitDialectConfiguration( explicitDatabaseName, configurationValues ) ) {
140160
jdbcEnvironment = getJdbcEnvironmentWithExplicitConfiguration(
@@ -146,33 +166,31 @@ else if ( explicitDialectConfiguration( explicitDatabaseName, configurationValue
146166
explicitDatabaseMinorVersion,
147167
explicitDatabaseVersion
148168
);
149-
databaseConnectionInfo = buildDbInfo( configurationValues, jdbcEnvironment.getDialect() );
169+
databaseConnectionInfo = buildInfo( configurationValues, jdbcEnvironment );
150170
}
151171
else {
152172
jdbcEnvironment = getJdbcEnvironmentWithDefaults( configurationValues, registry, dialectFactory );
153-
databaseConnectionInfo = buildDbInfo( configurationValues, jdbcEnvironment.getDialect() );
173+
databaseConnectionInfo = buildInfo( configurationValues, jdbcEnvironment );
154174
}
155175

156-
// Standardized DB info logging
176+
// Standardized info logging
157177
ConnectionInfoLogger.INSTANCE.logConnectionInfoDetails( databaseConnectionInfo.toInfoString() );
158-
159178
return jdbcEnvironment;
160179
}
161180

162-
private DatabaseConnectionInfo buildDbInfo(ServiceRegistryImplementor registry, Dialect dialect) {
163-
if ( !isMultiTenancyEnabled( registry ) ) {
164-
return registry.requireService( ConnectionProvider.class )
165-
.getDatabaseConnectionInfo( dialect );
181+
private DatabaseConnectionInfo buildInfo(ServiceRegistryImplementor registry, JdbcEnvironment environment) {
182+
if ( isMultiTenancyEnabled( registry ) ) {
183+
return registry.requireService( MultiTenantConnectionProvider.class )
184+
.getDatabaseConnectionInfo( environment.getDialect() );
166185
}
167186
else {
168-
final MultiTenantConnectionProvider<?> mcp =
169-
registry.requireService( MultiTenantConnectionProvider.class );
170-
return mcp.getDatabaseConnectionInfo( dialect );
187+
return registry.requireService( ConnectionProvider.class )
188+
.getDatabaseConnectionInfo( environment.getDialect(), environment.getExtractedDatabaseMetaData() );
171189
}
172190
}
173191

174-
private DatabaseConnectionInfo buildDbInfo(Map<String, Object> configurationValues, Dialect dialect) {
175-
return new DatabaseConnectionInfoImpl( configurationValues, dialect );
192+
private DatabaseConnectionInfo buildInfo(Map<String, Object> configurationValues, JdbcEnvironment environment) {
193+
return new DatabaseConnectionInfoImpl( configurationValues, environment.getDialect() );
176194
}
177195

178196
private static JdbcEnvironmentImpl getJdbcEnvironmentWithDefaults(
@@ -372,7 +390,7 @@ private int databaseMicroVersion(DatabaseMetaData metadata) throws SQLException
372390
try {
373391
final String substring = version.substring( prefix.length() );
374392
final String micro = new StringTokenizer(substring," .,-:;/()[]").nextToken();
375-
return Integer.parseInt(micro);
393+
return parseInt(micro);
376394
}
377395
catch (NumberFormatException nfe) {
378396
return 0;

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/ExtractedDatabaseMetaData.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,34 @@ public interface ExtractedDatabaseMetaData {
122122
*/
123123
SQLStateType getSqlStateType();
124124

125+
/**
126+
* Retrieve the JDBC URL.
127+
*
128+
* @see java.sql.DatabaseMetaData#getURL()
129+
*/
130+
String getUrl();
131+
132+
/**
133+
* Retrieve the JDBC driver name.
134+
*
135+
* @see java.sql.DatabaseMetaData#getDriverName()
136+
*/
137+
String getDriver();
138+
139+
/**
140+
* Retrieve the transaction isolation level.
141+
*
142+
* @see java.sql.Connection#getTransactionIsolation()
143+
*/
144+
int getTransactionIsolation();
145+
146+
/**
147+
* Retrieve the default transaction isolation level.
148+
*
149+
* @see java.sql.DatabaseMetaData#getDefaultTransactionIsolation()
150+
*/
151+
int getDefaultTransactionIsolation();
152+
125153
/**
126154
* Retrieve the list of {@code SequenceInformation} objects which describe the underlying database sequences.
127155
*

0 commit comments

Comments
 (0)