Как я объяснил в этой статье , Hibernate может выполнять маршрутизацию через MultiTenancyConnectionProvider
, которую вы можете реализовать следующим образом:
public class MultiTenantConnectionProvider
extends AbstractMultiTenantConnectionProvider {
public static final MultiTenantConnectionProvider INSTANCE =
new MultiTenantConnectionProvider();
private final Map<String, ConnectionProvider> connectionProviderMap =
new HashMap<>();
Map<String, ConnectionProvider> getConnectionProviderMap() {
return connectionProviderMap;
}
@Override
protected ConnectionProvider getAnyConnectionProvider() {
return connectionProviderMap.get(
TenantContext.DEFAULT_TENANT_IDENTIFIER
);
}
@Override
protected ConnectionProvider selectConnectionProvider(
String tenantIdentifier) {
return connectionProviderMap.get(
tenantIdentifier
);
}
}
Предполагая, что каждый арендатор использует свой собственный выделенный DataSource
, вы можете зарегистрировать индивидуальное ConnectionProviders
с помощью такого вспомогательного метода, как этот:
private void addTenantConnectionProvider(
String tenantId,
DataSource tenantDataSource,
Properties properties) {
DatasourceConnectionProviderImpl connectionProvider =
new DatasourceConnectionProviderImpl();
connectionProvider.setDataSource(tenantDataSource);
connectionProvider.configure(properties);
MultiTenantConnectionProvider.INSTANCE
.getConnectionProviderMap()
.put(
tenantId,
connectionProvider
);
}
Вы можете зарегистрировать клиента по умолчанию для задач, связанных с администратором:
addTenantConnectionProvider(
TenantContext.DEFAULT_TENANT_IDENTIFIER,
defaultDataSource,
properties()
);
А для настоящих арендаторов вы можете использовать такой метод:
private void addTenantConnectionProvider(
String tenantId) {
DataSourceProvider dataSourceProvider = database()
.dataSourceProvider();
Properties properties = properties();
MysqlDataSource tenantDataSource = new MysqlDataSource();
tenantDataSource.setDatabaseName(tenantId);
tenantDataSource.setUser(dataSourceProvider.username());
tenantDataSource.setPassword(dataSourceProvider.password());
properties.put(
Environment.DATASOURCE,
dataSourceProxyType().dataSource(tenantDataSource)
);
addTenantConnectionProvider(
tenantId,
tenantDataSource,
properties
);
}
Вы можете изменить MysqlDataSource
на любую базу данных, которую вы используете.
Тогда регистрация арендаторов так же проста:
addTenantConnectionProvider("asia");
addTenantConnectionProvider("europe");
Последнее, что нужно учитывать, - это предоставить реализацию MultiTenancyConnectionProvider
для Hibernate через свойство конфигурации hibernate.multi_tenant_connection_provider
.
properties.put(
AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER,
MultiTenantConnectionProvider.INSTANCE
);