0 Tage Serie
java / expert
Snippet

Dynamisches Multi-Tenancy-Routing mit AbstractRoutingDataSource

Dieses Experten-Pattern ermöglicht es einer Spring-Anwendung, zur Laufzeit basierend auf einem Lookup-Schlüssel (z. B. einer Tenant-ID aus einem ThreadLocal) zwischen mehreren Datenquellen zu wechseln. Dies ist entscheidend für SaaS-Architekturen, bei denen Datenisolation auf Datenbankebene erforderlich ist.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TenantRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TenantContext.getCurrentTenant();
}
}
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
TenantRoutingDataSource routingDataSource = new TenantRoutingDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("TENANT_A", tenantADataSource());
targetDataSources.put("TENANT_B", tenantBDataSource());
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.setDefaultTargetDataSource(defaultDataSource());
return routingDataSource;
}
}
spring
Erklärung
1
extends AbstractRoutingDataSource
Erbt vom internen Routing-Mechanismus von Spring zur dynamischen Auflösung von Datenquellen.
2
determineCurrentLookupKey()
Die Kernlogik, die Spring vor jeder Abfrage aufruft, um zu entscheiden, welche Datenbank verwendet werden soll.
3
setTargetDataSources(targetDataSources)
Registriert eine Map von verfügbaren Datenquellen, die ihren jeweiligen Lookup-Schlüsseln zugeordnet sind.