Skip to content

Commit a59f2ac

Browse files
committed
some cleanup to DatasourceConnectionProviderImpl and multi-tenant version
Signed-off-by: Gavin King <[email protected]>
1 parent 47c99d5 commit a59f2ac

File tree

4 files changed

+44
-42
lines changed

4 files changed

+44
-42
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/JdbcSettings.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,9 @@ public interface JdbcSettings extends C3p0Settings, ProxoolSettings, AgroalSetti
526526
/**
527527
* @see javax.sql.DataSource
528528
*
529-
* @deprecated The JPA-standard {@link #JAKARTA_JTA_DATASOURCE} or {@link #JAKARTA_JTA_DATASOURCE} setting
530-
* is now preferred.
529+
* @deprecated The JPA-standard {@value #JAKARTA_JTA_DATASOURCE} or
530+
* {@value #JAKARTA_NON_JTA_DATASOURCE} setting are now
531+
* preferred.
531532
*/
532533
@Deprecated
533534
String DATASOURCE = "hibernate.connection.datasource";

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import javax.sql.DataSource;
1313

1414
import org.hibernate.HibernateException;
15-
import org.hibernate.cfg.Environment;
15+
import org.hibernate.cfg.AvailableSettings;
16+
import org.hibernate.cfg.JdbcSettings;
1617
import org.hibernate.dialect.Dialect;
1718
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
1819
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
@@ -22,13 +23,17 @@
2223
import org.hibernate.service.spi.InjectService;
2324
import org.hibernate.service.spi.Stoppable;
2425

26+
import static org.hibernate.cfg.JdbcSettings.DATASOURCE;
27+
2528
/**
2629
* A {@link ConnectionProvider} that manages connections from an underlying {@link DataSource}.
2730
* <p>
2831
* The {@link DataSource} to use may be specified by either:<ul>
29-
* <li>injection using {@link #setDataSource}
30-
* <li>declaring the {@link DataSource} instance using the {@value Environment#DATASOURCE} config property
31-
* <li>declaring the JNDI name under which the {@link DataSource} is found via the {@value Environment#DATASOURCE} config property
32+
* <li>injection using {@link #setDataSource},
33+
* <li>passing the {@link DataSource} instance using {@value JdbcSettings#DATASOURCE},
34+
* {@value JdbcSettings#JAKARTA_JTA_DATASOURCE}, or {@value JdbcSettings#JAKARTA_NON_JTA_DATASOURCE}, or
35+
* <li>declaring the JNDI name under which the {@link DataSource} is found via {@value JdbcSettings#DATASOURCE},
36+
* {@value JdbcSettings#JAKARTA_JTA_DATASOURCE}, or {@value JdbcSettings#JAKARTA_NON_JTA_DATASOURCE}.
3237
* </ul>
3338
*
3439
* @author Gavin King
@@ -83,15 +88,15 @@ else if ( DataSource.class.isAssignableFrom( unwrapType ) ) {
8388
@Override
8489
public void configure(Map<String, Object> configValues) {
8590
if ( dataSource == null ) {
86-
final Object dataSourceSetting = configValues.get( Environment.DATASOURCE );
91+
final Object dataSourceSetting = configValues.get( DATASOURCE );
8792
if ( dataSourceSetting instanceof DataSource ) {
8893
dataSource = (DataSource) dataSourceSetting;
8994
}
9095
else {
9196
final String dataSourceJndiName = (String) dataSourceSetting;
9297
if ( dataSourceJndiName == null ) {
9398
throw new HibernateException(
94-
"DataSource to use was not injected nor specified by [" + Environment.DATASOURCE
99+
"DataSource to use was not injected nor specified by [" + DATASOURCE
95100
+ "] configuration property"
96101
);
97102
}
@@ -106,8 +111,8 @@ public void configure(Map<String, Object> configValues) {
106111
throw new HibernateException( "Unable to determine appropriate DataSource to use" );
107112
}
108113

109-
user = (String) configValues.get( Environment.USER );
110-
pass = (String) configValues.get( Environment.PASS );
114+
user = (String) configValues.get( AvailableSettings.USER );
115+
pass = (String) configValues.get( AvailableSettings.PASS );
111116
useCredentials = user != null || pass != null;
112117
available = true;
113118
}
@@ -150,7 +155,7 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
150155
@Override
151156
public String toInfoString() {
152157
return dataSourceJndiName != null
153-
? "\tDatasource JND name [" + dataSourceJndiName + "]"
158+
? "\tDatasource JNDI name [" + dataSourceJndiName + "]"
154159
: "\tProvided DataSource";
155160
}
156161
};

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

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,20 @@
2222
import org.hibernate.service.spi.ServiceRegistryImplementor;
2323
import org.hibernate.service.spi.Stoppable;
2424

25+
import static org.hibernate.cfg.JdbcSettings.DATASOURCE;
2526
import static org.hibernate.cfg.MultiTenancySettings.TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY;
2627

2728
/**
28-
* A concrete implementation of the {@link MultiTenantConnectionProvider} contract bases on a number of
29-
* reasonable assumptions. We assume that:<ul>
29+
* A concrete implementation of the {@link MultiTenantConnectionProvider} contract bases on
30+
* a number of reasonable assumptions. We assume that:<ul>
3031
* <li>
31-
* The {@link DataSource} instances are all available from JNDI named by the tenant identifier relative
32-
* to a single base JNDI context
32+
* The {@link DataSource} instances are all available from JNDI named by the tenant
33+
* identifier relative to a single base JNDI context.
3334
* </li>
3435
* <li>
3536
* {@value AvailableSettings#DATASOURCE} is a string naming either the {@literal any}
36-
* data source or the base JNDI context. If the latter, {@link MultiTenancySettings#TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY} must
37-
* also be set.
37+
* data source or the base JNDI context. If the latter,
38+
* {@link MultiTenancySettings#TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY} must also be set.
3839
* </li>
3940
* </ul>
4041
*
@@ -44,10 +45,11 @@ public class DataSourceBasedMultiTenantConnectionProviderImpl<T>
4445
extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl<T>
4546
implements ServiceRegistryAwareService, Stoppable {
4647

47-
private Map<T, DataSource> dataSourceMap;
48+
private final Map<T, DataSource> dataSourceMap = new ConcurrentHashMap<>();
4849
private JndiService jndiService;
4950
private T tenantIdentifierForAny;
5051
private String baseJndiNamespace;
52+
private String jndiName;
5153

5254
@Override
5355
protected DataSource selectAnyDataSource() {
@@ -65,21 +67,17 @@ protected DataSource selectDataSource(T tenantIdentifier) {
6567
}
6668

6769
private Map<T, DataSource> dataSourceMap() {
68-
if ( dataSourceMap == null ) {
69-
dataSourceMap = new ConcurrentHashMap<>();
70-
}
7170
return dataSourceMap;
7271
}
7372

7473
@Override
7574
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
76-
final Object dataSourceConfigValue =
77-
serviceRegistry.requireService( ConfigurationService.class )
78-
.getSettings().get( AvailableSettings.DATASOURCE );
75+
final ConfigurationService configurationService = serviceRegistry.requireService( ConfigurationService.class );
76+
final Object dataSourceConfigValue = configurationService.getSettings().get( DATASOURCE );
7977
if ( !(dataSourceConfigValue instanceof String) ) {
80-
throw new HibernateException( "Improper set up of DataSourceBasedMultiTenantConnectionProviderImpl" );
78+
throw new HibernateException( "illegal value for configuration setting '" + DATASOURCE + "'" );
8179
}
82-
final String jndiName = (String) dataSourceConfigValue;
80+
jndiName = (String) dataSourceConfigValue;
8381

8482
jndiService = serviceRegistry.getService( JndiService.class );
8583
if ( jndiService == null ) {
@@ -91,17 +89,18 @@ public void injectServices(ServiceRegistryImplementor serviceRegistry) {
9189
throw new HibernateException( "JNDI name [" + jndiName + "] could not be resolved" );
9290
}
9391

94-
if ( namedObject instanceof DataSource ) {
92+
if ( namedObject instanceof DataSource datasource ) {
9593
final int loc = jndiName.lastIndexOf( '/' );
96-
this.baseJndiNamespace = jndiName.substring( 0, loc );
97-
this.tenantIdentifierForAny = (T) jndiName.substring( loc + 1 );
98-
dataSourceMap().put( tenantIdentifierForAny, (DataSource) namedObject );
94+
baseJndiNamespace = jndiName.substring( 0, loc );
95+
final String prefix = jndiName.substring(loc + 1);
96+
tenantIdentifierForAny = (T) prefix;
97+
dataSourceMap().put( tenantIdentifierForAny, datasource );
9998
}
10099
else if ( namedObject instanceof Context ) {
101-
this.baseJndiNamespace = jndiName;
102-
this.tenantIdentifierForAny = (T) serviceRegistry.requireService( ConfigurationService.class )
103-
.getSettings()
104-
.get( TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY );
100+
baseJndiNamespace = jndiName;
101+
final Object configuredTenantId =
102+
configurationService.getSettings().get( TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY );
103+
tenantIdentifierForAny = (T) configuredTenantId;
105104
if ( tenantIdentifierForAny == null ) {
106105
throw new HibernateException( "JNDI name named a Context, but tenant identifier to use for ANY was not specified" );
107106
}
@@ -116,10 +115,7 @@ else if ( namedObject instanceof Context ) {
116115

117116
@Override
118117
public void stop() {
119-
if ( dataSourceMap != null ) {
120-
dataSourceMap.clear();
121-
dataSourceMap = null;
122-
}
118+
dataSourceMap.clear();
123119
}
124120

125121
@Override
@@ -139,5 +135,4 @@ public String toInfoString() {
139135
}
140136
};
141137
}
142-
143138
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,12 @@ else if ( explicitDialectConfiguration( explicitDatabaseName, configurationValue
163163

164164
private DatabaseConnectionInfo buildDbInfo(ServiceRegistryImplementor registry, Dialect dialect) {
165165
if ( !isMultiTenancyEnabled( registry ) ) {
166-
final ConnectionProvider cp = registry.requireService( ConnectionProvider.class );
167-
return cp.getDatabaseConnectionInfo( dialect );
166+
return registry.requireService( ConnectionProvider.class )
167+
.getDatabaseConnectionInfo( dialect );
168168
}
169169
else {
170-
final MultiTenantConnectionProvider<?> mcp = registry.requireService( MultiTenantConnectionProvider.class );
170+
final MultiTenantConnectionProvider<?> mcp =
171+
registry.requireService( MultiTenantConnectionProvider.class );
171172
return mcp.getDatabaseConnectionInfo( dialect );
172173
}
173174
}

0 commit comments

Comments
 (0)