HHH-18989 log more info when DataSource is used
get it from the DatabaseMetaData
This commit is contained in:
parent
aea72cccd5
commit
a6aeeba8fe
|
@ -12,13 +12,14 @@ import org.hibernate.dialect.Dialect;
|
|||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
|
||||
import org.hibernate.internal.util.NullnessHelper;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||
|
||||
import static org.hibernate.dialect.SimpleDatabaseVersion.ZERO_VERSION;
|
||||
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.interpretIsolation;
|
||||
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
|
||||
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
|
||||
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getString;
|
||||
|
||||
/**
|
||||
* Standard implementation of {@link DatabaseConnectionInfo}
|
||||
|
@ -122,7 +123,7 @@ public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo {
|
|||
}
|
||||
|
||||
private static String handleEmpty(String value) {
|
||||
return StringHelper.isNotEmpty( value ) ? value : DEFAULT;
|
||||
return isNotEmpty( value ) ? value : DEFAULT;
|
||||
}
|
||||
|
||||
private static String handleEmpty(DatabaseVersion dialectVersion) {
|
||||
|
@ -141,23 +142,23 @@ public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo {
|
|||
@SuppressWarnings("deprecation")
|
||||
private static String determineUrl(Map<String, Object> settings) {
|
||||
return NullnessHelper.coalesceSuppliedValues(
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.JAKARTA_JDBC_URL, settings ),
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.URL, settings ),
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.JPA_JDBC_URL, settings )
|
||||
() -> getString( JdbcSettings.JAKARTA_JDBC_URL, settings ),
|
||||
() -> getString( JdbcSettings.URL, settings ),
|
||||
() -> getString( JdbcSettings.JPA_JDBC_URL, settings )
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private static String determineDriver(Map<String, Object> settings) {
|
||||
return NullnessHelper.coalesceSuppliedValues(
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.JAKARTA_JDBC_DRIVER, settings ),
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.DRIVER, settings ),
|
||||
() -> ConfigurationHelper.getString( JdbcSettings.JPA_JDBC_DRIVER, settings )
|
||||
() -> getString( JdbcSettings.JAKARTA_JDBC_DRIVER, settings ),
|
||||
() -> getString( JdbcSettings.DRIVER, settings ),
|
||||
() -> getString( JdbcSettings.JPA_JDBC_DRIVER, settings )
|
||||
);
|
||||
}
|
||||
|
||||
private static String determineAutoCommitMode(Map<String, Object> settings) {
|
||||
return ConfigurationHelper.getString( JdbcSettings.AUTOCOMMIT, settings );
|
||||
return getString( JdbcSettings.AUTOCOMMIT, settings );
|
||||
}
|
||||
|
||||
private static String determineIsolationLevel(Map<String, Object> settings) {
|
||||
|
|
|
@ -16,6 +16,7 @@ import org.hibernate.dialect.Dialect;
|
|||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
|
||||
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
|
||||
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
|
||||
import org.hibernate.engine.jndi.spi.JndiService;
|
||||
import org.hibernate.internal.log.ConnectionInfoLogger;
|
||||
import org.hibernate.service.UnknownUnwrapTypeException;
|
||||
|
@ -24,6 +25,7 @@ import org.hibernate.service.spi.InjectService;
|
|||
import org.hibernate.service.spi.Stoppable;
|
||||
|
||||
import static org.hibernate.cfg.JdbcSettings.DATASOURCE;
|
||||
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
|
||||
|
||||
/**
|
||||
* A {@link ConnectionProvider} that manages connections from an underlying {@link DataSource}.
|
||||
|
@ -40,6 +42,7 @@ import static org.hibernate.cfg.JdbcSettings.DATASOURCE;
|
|||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DatasourceConnectionProviderImpl implements ConnectionProvider, Configurable, Stoppable {
|
||||
|
||||
private DataSource dataSource;
|
||||
private String user;
|
||||
private String pass;
|
||||
|
@ -149,21 +152,41 @@ public class DatasourceConnectionProviderImpl implements ConnectionProvider, Con
|
|||
|
||||
@Override
|
||||
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
|
||||
return getDatabaseConnectionInfo( dialect, null );
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
|
||||
final String url;
|
||||
final String driver;
|
||||
final String isolationLevel;
|
||||
if ( metaData != null ) {
|
||||
url = metaData.getUrl();
|
||||
driver = metaData.getDriver();
|
||||
isolationLevel = toIsolationNiceName( metaData.getTransactionIsolation() )
|
||||
+ " [default " + toIsolationNiceName( metaData.getDefaultTransactionIsolation() ) + "]";
|
||||
}
|
||||
else {
|
||||
url = null;
|
||||
driver = null;
|
||||
isolationLevel = null;
|
||||
}
|
||||
|
||||
return new DatabaseConnectionInfoImpl(
|
||||
DatasourceConnectionProviderImpl.class,
|
||||
null,
|
||||
null,
|
||||
url,
|
||||
driver,
|
||||
dialect.getVersion(),
|
||||
null,
|
||||
null,
|
||||
isolationLevel,
|
||||
null,
|
||||
null
|
||||
) {
|
||||
@Override
|
||||
public String toInfoString() {
|
||||
return dataSourceJndiName != null
|
||||
? "\tDatasource JNDI name [" + dataSourceJndiName + "]"
|
||||
: "\tProvided DataSource";
|
||||
? "\tDataSource JNDI name [" + dataSourceJndiName + "]\n" + super.toInfoString()
|
||||
: super.toInfoString();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@ import org.hibernate.service.spi.Stoppable;
|
|||
import org.hibernate.internal.log.ConnectionInfoLogger;
|
||||
|
||||
import static org.hibernate.cfg.JdbcSettings.JAKARTA_JDBC_URL;
|
||||
import static org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.toIsolationNiceName;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getInt;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getLong;
|
||||
|
@ -148,7 +149,7 @@ public class DriverManagerConnectionProviderImpl
|
|||
driverList,
|
||||
SimpleDatabaseVersion.ZERO_VERSION,
|
||||
Boolean.toString( autoCommit ),
|
||||
isolation != null ? ConnectionProviderInitiator.toIsolationNiceName( isolation ) : null,
|
||||
isolation != null ? toIsolationNiceName( isolation ) : null,
|
||||
getInt( MIN_SIZE, configurationValues, 1 ),
|
||||
getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 )
|
||||
);
|
||||
|
|
|
@ -9,6 +9,7 @@ import java.sql.SQLException;
|
|||
|
||||
import org.hibernate.dialect.Dialect;
|
||||
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
|
||||
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
|
||||
import org.hibernate.service.Service;
|
||||
import org.hibernate.service.spi.Wrapped;
|
||||
|
||||
|
@ -71,8 +72,21 @@ public interface ConnectionProvider extends Service, Wrapped {
|
|||
*/
|
||||
boolean supportsAggressiveRelease();
|
||||
|
||||
/**
|
||||
* @return an informative instance of {@link DatabaseConnectionInfo} for logging.
|
||||
*
|
||||
* @since 6.6
|
||||
*/
|
||||
default DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
|
||||
return new DatabaseConnectionInfoImpl( dialect );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an informative instance of {@link DatabaseConnectionInfo} for logging.
|
||||
*
|
||||
* @since 7.0
|
||||
*/
|
||||
default DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
|
||||
return getDatabaseConnectionInfo( dialect );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,6 +44,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
private final boolean supportsDataDefinitionInTransaction;
|
||||
private final boolean doesDataDefinitionCauseTransactionCommit;
|
||||
private final SQLStateType sqlStateType;
|
||||
private final int transactionIsolation;
|
||||
private final int defaultTransactionIsolation;
|
||||
private final String url;
|
||||
private final String driver;
|
||||
private final boolean jdbcMetadataAccessible;
|
||||
|
||||
|
||||
|
@ -65,6 +69,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
boolean supportsDataDefinitionInTransaction,
|
||||
boolean doesDataDefinitionCauseTransactionCommit,
|
||||
SQLStateType sqlStateType,
|
||||
int transactionIsolation,
|
||||
int defaultTransactionIsolation,
|
||||
String url,
|
||||
String driver,
|
||||
boolean jdbcMetadataIsAccessible) {
|
||||
this.jdbcEnvironment = jdbcEnvironment;
|
||||
this.connectionAccess = connectionAccess;
|
||||
|
@ -78,6 +86,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
this.supportsDataDefinitionInTransaction = supportsDataDefinitionInTransaction;
|
||||
this.doesDataDefinitionCauseTransactionCommit = doesDataDefinitionCauseTransactionCommit;
|
||||
this.sqlStateType = sqlStateType;
|
||||
this.transactionIsolation = transactionIsolation;
|
||||
this.defaultTransactionIsolation = defaultTransactionIsolation;
|
||||
this.url = url;
|
||||
this.driver = driver;
|
||||
this.jdbcMetadataAccessible = jdbcMetadataIsAccessible;
|
||||
}
|
||||
|
||||
|
@ -136,6 +148,26 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
return connectionSchemaName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDriver() {
|
||||
return driver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTransactionIsolation() {
|
||||
return transactionIsolation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDefaultTransactionIsolation() {
|
||||
return defaultTransactionIsolation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized List<SequenceInformation> getSequenceInformationList() {
|
||||
if ( jdbcMetadataAccessible ) {
|
||||
|
@ -175,6 +207,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
private boolean supportsDataDefinitionInTransaction;
|
||||
private boolean doesDataDefinitionCauseTransactionCommit;
|
||||
private SQLStateType sqlStateType;
|
||||
private String url;
|
||||
private String driver;
|
||||
private int defaultTransactionIsolation;
|
||||
private int transactionIsolation;
|
||||
|
||||
public Builder(JdbcEnvironment jdbcEnvironment, boolean jdbcMetadataIsAccessible, JdbcConnectionAccess connectionAccess) {
|
||||
this.jdbcEnvironment = jdbcEnvironment;
|
||||
|
@ -193,6 +229,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
supportsDataDefinitionInTransaction = !databaseMetaData.dataDefinitionIgnoredInTransactions();
|
||||
doesDataDefinitionCauseTransactionCommit = databaseMetaData.dataDefinitionCausesTransactionCommit();
|
||||
sqlStateType = SQLStateType.interpretReportedSQLStateType( databaseMetaData.getSQLStateType() );
|
||||
url = databaseMetaData.getURL();
|
||||
driver = databaseMetaData.getDriverName();
|
||||
defaultTransactionIsolation = databaseMetaData.getDefaultTransactionIsolation();
|
||||
transactionIsolation = databaseMetaData.getConnection().getTransactionIsolation();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -260,6 +300,10 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
|
|||
supportsDataDefinitionInTransaction,
|
||||
doesDataDefinitionCauseTransactionCommit,
|
||||
sqlStateType,
|
||||
transactionIsolation,
|
||||
defaultTransactionIsolation,
|
||||
url,
|
||||
driver,
|
||||
jdbcMetadataIsAccessible
|
||||
);
|
||||
}
|
||||
|
|
|
@ -86,12 +86,12 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment {
|
|||
final IdentifierHelperBuilder identifierHelperBuilder =
|
||||
identifierHelperBuilder( cfgService, nameQualifierSupport );
|
||||
|
||||
final ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder =
|
||||
final ExtractedDatabaseMetaDataImpl.Builder metaDataBuilder =
|
||||
new ExtractedDatabaseMetaDataImpl.Builder( this, false, null );
|
||||
|
||||
this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, dbMetaDataBuilder );;
|
||||
this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, metaDataBuilder );;
|
||||
|
||||
this.extractedMetaDataSupport = dbMetaDataBuilder.build();
|
||||
this.extractedMetaDataSupport = metaDataBuilder.build();
|
||||
|
||||
this.currentCatalog = identifierHelper.toIdentifier(
|
||||
cfgService.getSetting( AvailableSettings.DEFAULT_CATALOG, StandardConverters.STRING )
|
||||
|
|
|
@ -34,7 +34,6 @@ import org.hibernate.event.monitor.internal.EmptyEventMonitor;
|
|||
import org.hibernate.event.monitor.spi.EventMonitor;
|
||||
import org.hibernate.internal.CoreMessageLogger;
|
||||
import org.hibernate.internal.log.ConnectionInfoLogger;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.jdbc.AbstractReturningWork;
|
||||
import org.hibernate.jpa.internal.MutableJpaComplianceImpl;
|
||||
import org.hibernate.jpa.spi.JpaCompliance;
|
||||
|
@ -50,6 +49,7 @@ import org.hibernate.stat.spi.StatisticsImplementor;
|
|||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import static java.lang.Integer.parseInt;
|
||||
import static org.hibernate.cfg.AvailableSettings.CONNECTION_HANDLING;
|
||||
import static org.hibernate.cfg.AvailableSettings.DIALECT_DB_MAJOR_VERSION;
|
||||
import static org.hibernate.cfg.AvailableSettings.DIALECT_DB_MINOR_VERSION;
|
||||
|
@ -69,6 +69,7 @@ import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.isMulti
|
|||
import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
|
||||
import static org.hibernate.internal.util.NullnessHelper.coalesceSuppliedValues;
|
||||
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
|
||||
import static org.hibernate.internal.util.StringHelper.split;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getBooleanWrapper;
|
||||
import static org.hibernate.internal.util.config.ConfigurationHelper.getInteger;
|
||||
|
@ -100,8 +101,6 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
|
||||
@Override
|
||||
public JdbcEnvironment initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
|
||||
final DialectFactory dialectFactory = registry.requireService( DialectFactory.class );
|
||||
|
||||
final String explicitDatabaseName = getExplicitDatabaseName( configurationValues );
|
||||
Integer explicitDatabaseMajorVersion = getExplicitDatabaseMajorVersion( configurationValues );
|
||||
Integer explicitDatabaseMinorVersion = getExplicitDatabaseMinorVersion( configurationValues );
|
||||
|
@ -110,11 +109,11 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
getExplicitDatabaseVersion( configurationValues, explicitDatabaseMajorVersion, explicitDatabaseMinorVersion );
|
||||
|
||||
if ( explicitDatabaseMajorVersion == null && explicitDatabaseMinorVersion == null && explicitDatabaseVersion != null ) {
|
||||
final String[] parts = StringHelper.split( ".", explicitDatabaseVersion );
|
||||
final String[] parts = split( ".", explicitDatabaseVersion );
|
||||
try {
|
||||
final int potentialMajor = Integer.parseInt( parts[0] );
|
||||
final int potentialMajor = parseInt( parts[0] );
|
||||
if ( parts.length > 1 ) {
|
||||
explicitDatabaseMinorVersion = Integer.parseInt( parts[1] );
|
||||
explicitDatabaseMinorVersion = parseInt( parts[1] );
|
||||
}
|
||||
explicitDatabaseMajorVersion = potentialMajor;
|
||||
}
|
||||
|
@ -123,8 +122,27 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
}
|
||||
}
|
||||
|
||||
return getJdbcEnvironment(
|
||||
configurationValues,
|
||||
registry,
|
||||
explicitDatabaseName,
|
||||
explicitDatabaseMajorVersion,
|
||||
explicitDatabaseMinorVersion,
|
||||
explicitDatabaseVersion
|
||||
);
|
||||
}
|
||||
|
||||
private JdbcEnvironment getJdbcEnvironment(
|
||||
Map<String, Object> configurationValues,
|
||||
ServiceRegistryImplementor registry,
|
||||
String explicitDatabaseName,
|
||||
Integer explicitDatabaseMajorVersion,
|
||||
Integer explicitDatabaseMinorVersion,
|
||||
String explicitDatabaseVersion) {
|
||||
final DialectFactory dialectFactory = registry.requireService( DialectFactory.class );
|
||||
|
||||
final JdbcEnvironment jdbcEnvironment;
|
||||
DatabaseConnectionInfo databaseConnectionInfo;
|
||||
final DatabaseConnectionInfo databaseConnectionInfo;
|
||||
if ( allowJdbcMetadataAccess( configurationValues ) ) {
|
||||
jdbcEnvironment = getJdbcEnvironmentUsingJdbcMetadata(
|
||||
configurationValues,
|
||||
|
@ -133,8 +151,9 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
explicitDatabaseName,
|
||||
explicitDatabaseMajorVersion,
|
||||
explicitDatabaseMinorVersion,
|
||||
explicitDatabaseVersion);
|
||||
databaseConnectionInfo = buildDbInfo( registry, jdbcEnvironment.getDialect() );
|
||||
explicitDatabaseVersion
|
||||
);
|
||||
databaseConnectionInfo = buildInfo( registry, jdbcEnvironment );
|
||||
}
|
||||
else if ( explicitDialectConfiguration( explicitDatabaseName, configurationValues ) ) {
|
||||
jdbcEnvironment = getJdbcEnvironmentWithExplicitConfiguration(
|
||||
|
@ -146,33 +165,31 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
explicitDatabaseMinorVersion,
|
||||
explicitDatabaseVersion
|
||||
);
|
||||
databaseConnectionInfo = buildDbInfo( configurationValues, jdbcEnvironment.getDialect() );
|
||||
databaseConnectionInfo = buildInfo( configurationValues, jdbcEnvironment );
|
||||
}
|
||||
else {
|
||||
jdbcEnvironment = getJdbcEnvironmentWithDefaults( configurationValues, registry, dialectFactory );
|
||||
databaseConnectionInfo = buildDbInfo( configurationValues, jdbcEnvironment.getDialect() );
|
||||
databaseConnectionInfo = buildInfo( configurationValues, jdbcEnvironment );
|
||||
}
|
||||
|
||||
// Standardized DB info logging
|
||||
// Standardized info logging
|
||||
ConnectionInfoLogger.INSTANCE.logConnectionInfoDetails( databaseConnectionInfo.toInfoString() );
|
||||
|
||||
return jdbcEnvironment;
|
||||
}
|
||||
|
||||
private DatabaseConnectionInfo buildDbInfo(ServiceRegistryImplementor registry, Dialect dialect) {
|
||||
if ( !isMultiTenancyEnabled( registry ) ) {
|
||||
return registry.requireService( ConnectionProvider.class )
|
||||
.getDatabaseConnectionInfo( dialect );
|
||||
private DatabaseConnectionInfo buildInfo(ServiceRegistryImplementor registry, JdbcEnvironment environment) {
|
||||
if ( isMultiTenancyEnabled( registry ) ) {
|
||||
return registry.requireService( MultiTenantConnectionProvider.class )
|
||||
.getDatabaseConnectionInfo( environment.getDialect() );
|
||||
}
|
||||
else {
|
||||
final MultiTenantConnectionProvider<?> mcp =
|
||||
registry.requireService( MultiTenantConnectionProvider.class );
|
||||
return mcp.getDatabaseConnectionInfo( dialect );
|
||||
return registry.requireService( ConnectionProvider.class )
|
||||
.getDatabaseConnectionInfo( environment.getDialect(), environment.getExtractedDatabaseMetaData() );
|
||||
}
|
||||
}
|
||||
|
||||
private DatabaseConnectionInfo buildDbInfo(Map<String, Object> configurationValues, Dialect dialect) {
|
||||
return new DatabaseConnectionInfoImpl( configurationValues, dialect );
|
||||
private DatabaseConnectionInfo buildInfo(Map<String, Object> configurationValues, JdbcEnvironment environment) {
|
||||
return new DatabaseConnectionInfoImpl( configurationValues, environment.getDialect() );
|
||||
}
|
||||
|
||||
private static JdbcEnvironmentImpl getJdbcEnvironmentWithDefaults(
|
||||
|
@ -372,7 +389,7 @@ public class JdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEn
|
|||
try {
|
||||
final String substring = version.substring( prefix.length() );
|
||||
final String micro = new StringTokenizer(substring," .,-:;/()[]").nextToken();
|
||||
return Integer.parseInt(micro);
|
||||
return parseInt(micro);
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
return 0;
|
||||
|
|
|
@ -122,6 +122,34 @@ public interface ExtractedDatabaseMetaData {
|
|||
*/
|
||||
SQLStateType getSqlStateType();
|
||||
|
||||
/**
|
||||
* Retrieve the JDBC URL.
|
||||
*
|
||||
* @see java.sql.DatabaseMetaData#getURL()
|
||||
*/
|
||||
String getUrl();
|
||||
|
||||
/**
|
||||
* Retrieve the JDBC driver name.
|
||||
*
|
||||
* @see java.sql.DatabaseMetaData#getDriverName()
|
||||
*/
|
||||
String getDriver();
|
||||
|
||||
/**
|
||||
* Retrieve the transaction isolation level.
|
||||
*
|
||||
* @see java.sql.Connection#getTransactionIsolation()
|
||||
*/
|
||||
int getTransactionIsolation();
|
||||
|
||||
/**
|
||||
* Retrieve the default transaction isolation level.
|
||||
*
|
||||
* @see java.sql.DatabaseMetaData#getDefaultTransactionIsolation()
|
||||
*/
|
||||
int getDefaultTransactionIsolation();
|
||||
|
||||
/**
|
||||
* Retrieve the list of {@code SequenceInformation} objects which describe the underlying database sequences.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
* Copyright Red Hat Inc. and Hibernate Authors
|
||||
*/
|
||||
package org.hibernate.orm.test.datasource;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.cfg.JdbcSettings;
|
||||
import org.hibernate.internal.log.ConnectionInfoLogger;
|
||||
import org.hibernate.testing.logger.LogInspectionHelper;
|
||||
import org.hibernate.testing.logger.LogListener;
|
||||
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||
import org.hibernate.testing.orm.junit.Jpa;
|
||||
import org.hibernate.testing.orm.junit.Setting;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import static org.hibernate.internal.util.StringHelper.split;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
@Jpa(annotatedClasses = DataSourceTest.TestEntity.class,
|
||||
integrationSettings = @Setting(name = JdbcSettings.CONNECTION_PROVIDER,
|
||||
value = "org.hibernate.orm.test.datasource.TestDataSourceConnectionProvider"))
|
||||
public class DataSourceTest {
|
||||
@Test
|
||||
void test(EntityManagerFactoryScope scope) {
|
||||
Listener listener = new Listener();
|
||||
LogInspectionHelper.registerListener( listener, ConnectionInfoLogger.INSTANCE );
|
||||
scope.getEntityManagerFactory();
|
||||
LogInspectionHelper.clearAllListeners( ConnectionInfoLogger.INSTANCE );
|
||||
assertTrue( listener.seen );
|
||||
}
|
||||
|
||||
@Entity(name="TestEntity")
|
||||
static class TestEntity {
|
||||
@Id
|
||||
long id;
|
||||
}
|
||||
|
||||
private static class Listener implements LogListener {
|
||||
boolean seen = false;
|
||||
|
||||
@Override
|
||||
public void loggedEvent(Logger.Level level, String renderedMessage, Throwable thrown) {
|
||||
if ( renderedMessage.contains( "Database info:" ) ) {
|
||||
seen = true;
|
||||
final Properties properties = Environment.getProperties();
|
||||
assertTrue( renderedMessage.contains( split( ";", properties.getProperty(JdbcSettings.URL) )[0] ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
* Copyright Red Hat Inc. and Hibernate Authors
|
||||
*/
|
||||
package org.hibernate.orm.test.datasource;
|
||||
|
||||
import org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl;
|
||||
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
|
||||
import org.hibernate.service.spi.ServiceRegistryAwareService;
|
||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.io.PrintWriter;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.SQLFeatureNotSupportedException;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class TestDataSourceConnectionProvider
|
||||
extends DatasourceConnectionProviderImpl
|
||||
implements ServiceRegistryAwareService {
|
||||
|
||||
final DriverManagerConnectionProviderImpl delegate = new DriverManagerConnectionProviderImpl();
|
||||
|
||||
@Override
|
||||
public void configure(Map<String, Object> configValues) {
|
||||
delegate.configure(configValues);
|
||||
setDataSource( new DataSource() {
|
||||
PrintWriter logWriter = new PrintWriter( System.out );
|
||||
@Override
|
||||
public Connection getConnection() throws SQLException {
|
||||
return delegate.getConnection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Connection getConnection(String username, String password) throws SQLException {
|
||||
return delegate.getConnection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PrintWriter getLogWriter() {
|
||||
return logWriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLogWriter(PrintWriter out) {
|
||||
this.logWriter = out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLoginTimeout(int seconds) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLoginTimeout() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T unwrap(Class<T> iface) throws SQLException {
|
||||
throw new SQLFeatureNotSupportedException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrapperFor(Class<?> iface) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
|
||||
throw new SQLFeatureNotSupportedException();
|
||||
}
|
||||
} );
|
||||
super.configure( configValues );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
|
||||
delegate.injectServices( serviceRegistry );
|
||||
}
|
||||
}
|
|
@ -14,6 +14,7 @@ import org.hibernate.dialect.Dialect;
|
|||
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
|
||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
|
||||
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
|
||||
import org.hibernate.service.spi.Configurable;
|
||||
import org.hibernate.service.spi.ServiceRegistryAwareService;
|
||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||
|
@ -108,6 +109,11 @@ public class ConnectionProviderDelegate implements
|
|||
return connectionProvider.getDatabaseConnectionInfo( dialect );
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
|
||||
return connectionProvider.getDatabaseConnectionInfo( dialect, metaData );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnwrappableAs(Class<?> unwrapType) {
|
||||
return connectionProvider.isUnwrappableAs( unwrapType );
|
||||
|
|
|
@ -56,6 +56,7 @@ import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiato
|
|||
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
|
||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
|
||||
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
|
||||
import org.hibernate.internal.build.AllowSysOut;
|
||||
import org.hibernate.service.spi.Configurable;
|
||||
import org.hibernate.service.spi.ServiceRegistryAwareService;
|
||||
|
@ -183,6 +184,11 @@ public class JtaAwareConnectionProviderImpl implements ConnectionProvider, Confi
|
|||
return delegate.getDatabaseConnectionInfo( dialect );
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
|
||||
return delegate.getDatabaseConnectionInfo( dialect, metaData );
|
||||
}
|
||||
|
||||
protected Transaction findCurrentTransaction() {
|
||||
try {
|
||||
return TestingJtaPlatformImpl.transactionManager().getTransaction();
|
||||
|
|
Loading…
Reference in New Issue