Как настроить несколько источников данных для нескольких арендаторов в Hibernate - PullRequest
5 голосов
/ 24 июля 2011

Я пытаюсь добавить мультитенантность в Java-приложение, используя подход с отдельной схемой, как описано в этом вебинаре

Я хотел знать, как мне настроить несколько источников данных с помощью Spring, возможно, с помощью файлов свойств и получить источники данных из контекста Spring на основе идентификатора клиента.

Что еще более важно, хотя я хочу иметь возможность настроить реализацию своего настраиваемого поставщика соединений, которая поддерживает эту функцию многопользовательского режима, которая будет использоваться Hibernate вместо введенного ConnectionProvider, который он использует по умолчанию.

Как мне этого добиться.

Ответы [ 4 ]

4 голосов
/ 24 июля 2011
2 голосов
/ 25 октября 2011

В этом посте показано, как использовать Spring Security и AbstractRoutingDataSource для создания мультиарендных приложений SaaS. Расширение Spring Security для защиты мультитенантных приложений SaaS

1 голос
/ 16 августа 2018

Как я объяснил в этой статье , 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
);
1 голос
/ 31 марта 2014

Если вы хотите сделать многопользовательский режим ConnectionProvider, вам потребуется локальный поток для предоставления контекста.Смотрите этот краткий прогон:

http://literatejava.com/hibernate/multi-tenancy-architecture-with-hibernate/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...