Skip to content

Commit 1361ed3

Browse files
committed
some refactoring to DriverManagerConnectionProvider
- clean up initialization logic which was a mess - use ServiceRegistry instead of ServiceRegistryImplementor
1 parent bfc7d16 commit 1361ed3

File tree

8 files changed

+81
-81
lines changed

8 files changed

+81
-81
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
import org.hibernate.exception.internal.SQLStateConversionDelegate;
1717
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
1818
import org.hibernate.internal.util.ValueHolder;
19+
import org.hibernate.service.ServiceRegistry;
1920
import org.hibernate.service.spi.ServiceException;
20-
import org.hibernate.service.spi.ServiceRegistryImplementor;
2121

2222
/**
2323
* Template (as in template pattern) support for {@link ConnectionCreator} implementors.
2424
*
2525
* @author Steve Ebersole
2626
*/
2727
public abstract class BasicConnectionCreator implements ConnectionCreator {
28-
private final ServiceRegistryImplementor serviceRegistry;
28+
private final ServiceRegistry serviceRegistry;
2929

3030
private final String url;
3131
private final Properties connectionProps;
@@ -35,7 +35,7 @@ public abstract class BasicConnectionCreator implements ConnectionCreator {
3535
private final String initSql;
3636

3737
public BasicConnectionCreator(
38-
ServiceRegistryImplementor serviceRegistry,
38+
ServiceRegistry serviceRegistry,
3939
String url,
4040
Properties connectionProps,
4141
boolean autocommit,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.Map;
99
import java.util.Properties;
1010

11-
import org.hibernate.service.spi.ServiceRegistryImplementor;
11+
import org.hibernate.service.ServiceRegistry;
1212

1313
/**
1414
* A factory for {@link ConnectionCreator}.
@@ -19,7 +19,7 @@ public interface ConnectionCreatorFactory {
1919

2020
ConnectionCreator create(
2121
Driver driver,
22-
ServiceRegistryImplementor serviceRegistry,
22+
ServiceRegistry serviceRegistry,
2323
String url,
2424
Properties connectionProps,
2525
Boolean autocommit,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.Map;
99
import java.util.Properties;
1010

11-
import org.hibernate.service.spi.ServiceRegistryImplementor;
11+
import org.hibernate.service.ServiceRegistry;
1212

1313
/**
1414
* The default factory for {@link ConnectionCreator} instances.
@@ -25,7 +25,7 @@ private ConnectionCreatorFactoryImpl() {
2525
@Override
2626
public ConnectionCreator create(
2727
Driver driver,
28-
ServiceRegistryImplementor serviceRegistry,
28+
ServiceRegistry serviceRegistry,
2929
String url,
3030
Properties connectionProps,
3131
Boolean autoCommit,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public DatabaseConnectionInfoImpl(
5252
Class<? extends ConnectionProvider> connectionProviderClass,
5353
String jdbcUrl,
5454
String jdbcDriver,
55-
Class<? extends Dialect> dialectClass, DatabaseVersion dialectVersion,
55+
Class<? extends Dialect> dialectClass,
56+
DatabaseVersion dialectVersion,
5657
boolean hasSchema,
5758
boolean hasCatalog,
5859
String schema,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import java.sql.SQLException;
1010
import java.util.Properties;
1111

12-
import org.hibernate.service.spi.ServiceRegistryImplementor;
12+
import org.hibernate.service.ServiceRegistry;
1313

1414
/**
1515
* A specialized {@link ConnectionCreator} which uses {@link Driver#connect(String, Properties)}
@@ -22,7 +22,7 @@ public class DriverConnectionCreator extends BasicConnectionCreator {
2222

2323
public DriverConnectionCreator(
2424
Driver driver,
25-
ServiceRegistryImplementor serviceRegistry,
25+
ServiceRegistry serviceRegistry,
2626
String url,
2727
Properties connectionProps,
2828
Boolean autocommit,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import java.sql.SQLException;
1010
import java.util.Properties;
1111

12-
import org.hibernate.service.spi.ServiceRegistryImplementor;
12+
import org.hibernate.service.ServiceRegistry;
1313

1414
/**
1515
* A specialized {@link ConnectionCreator} which uses {@link DriverManager#getConnection(String, Properties)}
@@ -19,7 +19,7 @@
1919
*/
2020
public class DriverManagerConnectionCreator extends BasicConnectionCreator {
2121
public DriverManagerConnectionCreator(
22-
ServiceRegistryImplementor serviceRegistry,
22+
ServiceRegistry serviceRegistry,
2323
String url,
2424
Properties connectionProps,
2525
Boolean autocommit,

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

Lines changed: 64 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
2020
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
2121
import org.hibernate.exception.JDBCConnectionException;
22+
import org.hibernate.service.ServiceRegistry;
2223
import org.hibernate.service.UnknownUnwrapTypeException;
2324
import org.hibernate.service.spi.Configurable;
2425
import org.hibernate.service.spi.ServiceException;
@@ -44,6 +45,7 @@
4445
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
4546
import static org.hibernate.internal.util.config.ConfigurationHelper.getInt;
4647
import static org.hibernate.internal.util.config.ConfigurationHelper.getLong;
48+
import static org.hibernate.internal.util.config.ConfigurationHelper.getString;
4749

4850
/**
4951
* A connection provider that uses the {@link DriverManager} directly to open connections and provides
@@ -70,7 +72,7 @@ public class DriverManagerConnectionProviderImpl
7072

7173
// create the pool ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7274

73-
private volatile ServiceRegistryImplementor serviceRegistry;
75+
private volatile ServiceRegistry serviceRegistry;
7476

7577
@Override
7678
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
@@ -80,67 +82,33 @@ public void injectServices(ServiceRegistryImplementor serviceRegistry) {
8082
@Override
8183
public void configure(Map<String, Object> configurationValues) {
8284
ConnectionInfoLogger.INSTANCE.usingHibernateBuiltInConnectionPool();
83-
PooledConnections pool = buildPool( configurationValues, serviceRegistry );
85+
final PooledConnections pool = buildPool( configurationValues, serviceRegistry );
8486
final long validationInterval = getLong( VALIDATION_INTERVAL, configurationValues, 30 );
8587
state = new PoolState( pool, validationInterval );
8688
}
8789

88-
private PooledConnections buildPool(Map<String,Object> configuration, ServiceRegistryImplementor serviceRegistry) {
89-
final var creator = buildCreator( configuration, serviceRegistry );
90+
private PooledConnections buildPool(Map<String,Object> configuration, ServiceRegistry serviceRegistry) {
91+
// connection settings
92+
final String url = jdbcUrl( configuration );
93+
final String driverClassName = getString( DRIVER, configuration );
94+
final Properties connectionProps = getConnectionProperties( configuration );
9095
final boolean autoCommit = getBoolean( AUTOCOMMIT, configuration ); // default autocommit to false
96+
final Integer isolation = extractIsolation( configuration );
97+
final String initSql = getString( INIT_SQL, configuration );
98+
99+
// pool settings
91100
final int minSize = getInt( MIN_SIZE, configuration, 1 );
92101
final int maxSize = getInt( POOL_SIZE, configuration, 20 );
93102
final int initialSize = getInt( INITIAL_SIZE, configuration, minSize );
94-
return new PooledConnections.Builder( creator )
95-
.autoCommit( autoCommit )
96-
.initialSize( initialSize )
97-
.minSize( minSize )
98-
.maxSize( maxSize )
99-
.validator( this )
100-
.build();
101-
}
102-
103-
private static ConnectionCreator buildCreator(
104-
Map<String,Object> configurationValues, ServiceRegistryImplementor serviceRegistry) {
105-
final String url = jdbcUrl( configurationValues );
106103

107-
String driverClassName = (String) configurationValues.get( DRIVER );
108-
boolean success = false;
109-
Driver driver = null;
110-
if ( driverClassName != null ) {
111-
driver = loadDriverIfPossible( driverClassName, serviceRegistry );
112-
success = true;
113-
}
114-
else {
115-
//try to guess the driver class from the JDBC URL
116-
for ( var database: Database.values() ) {
117-
if ( database.matchesUrl( url ) ) {
118-
driverClassName = database.getDriverClassName( url );
119-
if ( driverClassName != null ) {
120-
try {
121-
loadDriverIfPossible( driverClassName, serviceRegistry );
122-
success = true;
123-
}
124-
catch (Exception e) {
125-
//swallow it, since this was not
126-
//an explicit setting by the user
127-
}
128-
break;
129-
}
130-
}
131-
}
104+
final Driver driver = loadDriver( driverClassName, serviceRegistry, url );
105+
if ( driver == null ) {
106+
//we're hoping that the driver is already loaded
107+
logAvailableDrivers();
132108
}
133109

134-
final String driverList = success ? driverClassName : driverList();
135-
136-
final Properties connectionProps = getConnectionProperties( configurationValues );
137-
138-
final boolean autoCommit = getBoolean( AUTOCOMMIT, configurationValues );
139-
final Integer isolation = extractIsolation( configurationValues );
140-
final String initSql = (String) configurationValues.get( INIT_SQL );
141-
142110
final var connectionCreator =
143-
getConnectionCreatorFactory( configurationValues, serviceRegistry )
111+
getConnectionCreatorFactory( configuration, serviceRegistry )
144112
.create(
145113
driver,
146114
serviceRegistry,
@@ -149,15 +117,14 @@ private static ConnectionCreator buildCreator(
149117
autoCommit,
150118
isolation,
151119
initSql,
152-
configurationValues
120+
configuration
153121
);
154122

155-
156123
try ( var connection = connectionCreator.createConnection() ) {
157124
dbInfo = new DatabaseConnectionInfoImpl(
158125
DriverManagerConnectionProviderImpl.class,
159126
url,
160-
driverList,
127+
driver == null ? null : driver.getClass().getName(),
161128
null,
162129
SimpleDatabaseVersion.ZERO_VERSION,
163130
hasSchema( connection ),
@@ -168,8 +135,8 @@ private static ConnectionCreator buildCreator(
168135
isolation != null
169136
? toIsolationNiceName( isolation )
170137
: toIsolationNiceName( getIsolation( connection ) ),
171-
getInt( MIN_SIZE, configurationValues, 1 ),
172-
getInt( POOL_SIZE, configurationValues, 20 ),
138+
minSize,
139+
maxSize,
173140
getFetchSize( connection )
174141
);
175142
if ( !connection.getAutoCommit() ) {
@@ -180,11 +147,39 @@ private static ConnectionCreator buildCreator(
180147
throw new JDBCConnectionException( "Could not create connection", e );
181148
}
182149

183-
return connectionCreator;
150+
return new PooledConnections.Builder( connectionCreator )
151+
.autoCommit( autoCommit )
152+
.initialSize( initialSize )
153+
.minSize( minSize )
154+
.maxSize( maxSize )
155+
.validator( this )
156+
.build();
157+
}
158+
159+
private static Driver loadDriver(String driverClassName, ServiceRegistry serviceRegistry, String url) {
160+
if ( driverClassName != null ) {
161+
return loadDriverIfPossible( driverClassName, serviceRegistry );
162+
}
163+
else {
164+
// try to guess the driver class from the JDBC URL
165+
for ( var database: Database.values() ) {
166+
if ( database.matchesUrl( url ) ) {
167+
final String databaseDriverClassName = database.getDriverClassName( url );
168+
if ( databaseDriverClassName != null ) {
169+
try {
170+
return loadDriverIfPossible( databaseDriverClassName, serviceRegistry );
171+
}
172+
catch (Exception e) {
173+
// swallow it, since this was not an explicit setting by the user
174+
}
175+
}
176+
}
177+
}
178+
return null;
179+
}
184180
}
185181

186-
private static String driverList() {
187-
//we're hoping that the driver is already loaded
182+
private static void logAvailableDrivers() {
188183
ConnectionInfoLogger.INSTANCE.jdbcDriverNotSpecified();
189184
final var list = new StringBuilder();
190185
DriverManager.drivers()
@@ -194,20 +189,20 @@ private static String driverList() {
194189
}
195190
list.append( driver.getClass().getName() );
196191
} );
197-
return list.toString();
192+
ConnectionInfoLogger.INSTANCE.availableJdbcDrivers( list.toString() );
198193
}
199194

200-
private static String jdbcUrl(Map<String, Object> configurationValues) {
201-
final String url = (String) configurationValues.get( URL );
195+
private static String jdbcUrl(Map<String, Object> configuration) {
196+
final String url = (String) configuration.get( URL );
202197
if ( url == null ) {
203198
throw new ConnectionProviderConfigurationException( "No JDBC URL specified by property '" + JAKARTA_JDBC_URL + "'" );
204199
}
205200
return url;
206201
}
207202

208203
private static ConnectionCreatorFactory getConnectionCreatorFactory(
209-
Map<String, Object> configurationValues, ServiceRegistryImplementor serviceRegistry) {
210-
final Object connectionCreatorFactory = configurationValues.get( CONNECTION_CREATOR_FACTORY );
204+
Map<String, Object> configuration, ServiceRegistry serviceRegistry) {
205+
final Object connectionCreatorFactory = configuration.get( CONNECTION_CREATOR_FACTORY );
211206
final ConnectionCreatorFactory factory;
212207
if ( connectionCreatorFactory instanceof ConnectionCreatorFactory instance ) {
213208
factory = instance;
@@ -221,7 +216,7 @@ else if ( connectionCreatorFactory != null ) {
221216
return factory == null ? ConnectionCreatorFactoryImpl.INSTANCE : factory;
222217
}
223218

224-
private static Driver loadDriverIfPossible(String driverClassName, ServiceRegistryImplementor serviceRegistry) {
219+
private static Driver loadDriverIfPossible(String driverClassName, ServiceRegistry serviceRegistry) {
225220
if ( driverClassName == null ) {
226221
ConnectionInfoLogger.INSTANCE.debug( "No driver class specified" );
227222
return null;
@@ -248,7 +243,7 @@ else if ( serviceRegistry != null ) {
248243
}
249244

250245
private static ConnectionCreatorFactory loadConnectionCreatorFactory(
251-
String connectionCreatorFactoryClassName, ServiceRegistryImplementor serviceRegistry) {
246+
String connectionCreatorFactoryClassName, ServiceRegistry serviceRegistry) {
252247
if ( connectionCreatorFactoryClassName == null ) {
253248
ConnectionInfoLogger.INSTANCE.debug( "No connection creator factory class specified" );
254249
return null;
@@ -261,17 +256,17 @@ else if ( serviceRegistry != null ) {
261256
return factoryClass.newInstance();
262257
}
263258
catch ( Exception e ) {
264-
throw new ServiceException( "Specified ConnectionCreatorFactory " + connectionCreatorFactoryClassName + " could not be loaded", e );
259+
throw new ServiceException( "Specified ConnectionCreatorFactory " + connectionCreatorFactoryClassName
260+
+ " could not be loaded", e );
265261
}
266262
}
267263
else {
268264
try {
269265
return (ConnectionCreatorFactory) Class.forName( connectionCreatorFactoryClassName ).newInstance();
270266
}
271267
catch (Exception e1) {
272-
throw new ServiceException(
273-
"Specified ConnectionCreatorFactory " + connectionCreatorFactoryClassName + " could not be loaded",
274-
e1 );
268+
throw new ServiceException( "Specified ConnectionCreatorFactory " + connectionCreatorFactoryClassName
269+
+ " could not be loaded", e1 );
275270
}
276271
}
277272
}

hibernate-core/src/main/java/org/hibernate/internal/log/ConnectionInfoLogger.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public interface ConnectionInfoLogger extends BasicLogger {
5555
+ JdbcSettings.DRIVER + "'")
5656
void jdbcDriverNotSpecified();
5757

58+
@LogMessage(level = INFO)
59+
@Message(id = 10001007, value = "Available JDBC drivers: [%s]")
60+
void availableJdbcDrivers(String availableDrivers);
61+
5862
@LogMessage(level = DEBUG)
5963
@Message(value = "Cleaning up connection pool [%s]", id = 10001008)
6064
void cleaningUpConnectionPool(String info);

0 commit comments

Comments
 (0)