0 Tage Serie
java / expert
Snippet

Dynamisches Datenbank-Routing mit AbstractRoutingDataSource

AbstractRoutingDataSource ermöglicht den Wechsel zwischen mehreren physischen Datenquellen zur Laufzeit basierend auf einem Lookup-Schlüssel, der normalerweise in einem ThreadLocal-Kontext gespeichert ist. Dies ist essenziell für Multi-Tenant-Architekturen, bei denen jeder Kunde eine eigene Datenbank hat.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class TenantRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TenantContext.getCurrentTenant();
}
}
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("TENANT_A", dataSourceA());
targetDataSources.put("TENANT_B", dataSourceB());
TenantRoutingDataSource routingDataSource = new TenantRoutingDataSource();
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.setDefaultTargetDataSource(dataSourceA());
return routingDataSource;
}
}
spring
Erklärung
1
protected Object determineCurrentLookupKey()
Bestimmt den Schlüssel, der verwendet wird, um die tatsächliche Datenquelle für den aktuellen Thread nachzuschlagen.
2
routingDataSource.setTargetDataSources(targetDataSources)
Registriert die Map der verfügbaren Datenquellen, die mit ihren jeweiligen Schlüsseln verknüpft sind.