복붙노트

[SPRING] 최대 절전 모드에서 다중 테넌트를 위해 다중 데이터 소스를 구성하는 방법

SPRING

최대 절전 모드에서 다중 테넌트를 위해 다중 데이터 소스를 구성하는 방법

이 웹 세미나에서 설명한대로 별도의 스키마 접근 방식을 사용하여 Java 응용 프로그램에 다중 테넌트를 추가하려고합니다.

나는 아마도 속성 파일을 사용하여 봄을 통해 여러 데이터 소스를 구성하고 세입자 ID를 기반으로 봄 컨텍스트에서 데이터 소스를 얻는 방법을 알고 싶었습니다.

가장 중요한 것은, 비록이 다중 테넌트 기능이 Hibernate가 기본적으로 사용하는 삽입 된 ConnectionProvider 대신에 사용되도록 지원하는 사용자 정의 연결 제공자 구현을 구성 할 수 있기를 원한다.

어떻게하면 이럴 수 있겠 어.

해결법

  1. ==============================

    1.AbstractRoutingDataSource를 사용하십시오. 둘 이상의 데이터 소스를 사용할 때 Spring의 @ Entity Manager 문제에있는 내 대답을 참조하십시오.

    AbstractRoutingDataSource를 사용하십시오. 둘 이상의 데이터 소스를 사용할 때 Spring의 @ Entity Manager 문제에있는 내 대답을 참조하십시오.

  2. ==============================

    2.이 게시물은 Spring Security와 AbstractRoutingDataSource를 사용하여 Multi-Tenancy SaaS 애플리케이션을 구축하는 방법을 보여줍니다. 다중 사용자 SaaS 애플리케이션 보호를위한 Spring 보안 확장

    이 게시물은 Spring Security와 AbstractRoutingDataSource를 사용하여 Multi-Tenancy SaaS 애플리케이션을 구축하는 방법을 보여줍니다. 다중 사용자 SaaS 애플리케이션 보호를위한 Spring 보안 확장

  3. ==============================

    3.ConnectionProvider에 의한 멀티 테넌시를 원한다면 문맥을 제공하기 위해 스레드 로컬이 필요합니다. 이 간단한 실행을 참조하십시오.

    ConnectionProvider에 의한 멀티 테넌시를 원한다면 문맥을 제공하기 위해 스레드 로컬이 필요합니다. 이 간단한 실행을 참조하십시오.

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

  4. ==============================

    4.이 기사에서 설명했듯이 다음과 같이 구현할 수있는 MultiTenancyConnectionProvider를 통해 Hibernate에서 라우팅을 수행 할 수 있습니다.

    이 기사에서 설명했듯이 다음과 같이 구현할 수있는 MultiTenancyConnectionProvider를 통해 Hibernate에서 라우팅을 수행 할 수 있습니다.

    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");
    

    고려해야 할 마지막 사항은 hibernate.multi_tenant_connection_provider 구성 등록 정보를 통해 MultiTenancyConnectionProvider 구현을 Hibernate에 제공하는 것입니다.

    properties.put(
        AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, 
        MultiTenantConnectionProvider.INSTANCE
    );
    
  5. from https://stackoverflow.com/questions/6804738/how-to-configure-multiple-datasources-for-multitenancy-in-hibernate by cc-by-sa and MIT license