[SPRING] spring-data-mongodb 멀티 테넌트 만들기
SPRINGspring-data-mongodb 멀티 테넌트 만들기
마지막으로 8 월에 sbzoom은 spring-data-mongoDB 멀티 테넌트를 만들기위한 해결책을 제안했습니다.
"당신은 자신의 RepositoryFactoryBean을 만들어야 만합니다. 다음은 Spring MongoDB Reference Docs의 예제입니다. 자신의 MongoTemplate을 구현하고 ensureIndexes () 호출을 지연 시키거나 제거해야하지만, 몇 가지 클래스를 다시 작성해야합니다. MongoTemplate이 Spring 대신 호출되도록하십시오. "
아무도 이것이나 비슷한 것을 구현 했습니까?
해결법
-
==============================
1.여기 고양이를 다듬는 데는 몇 가지 방법이 있습니다. 근본적으로 모두 당신이 임차를 적용하고 싶은 수준까지 내려갑니다.
여기 고양이를 다듬는 데는 몇 가지 방법이 있습니다. 근본적으로 모두 당신이 임차를 적용하고 싶은 수준까지 내려갑니다.
기본 접근법은 스레드별로 고객을 식별하는 일종의 키를 바인딩하여 현재 실행 스레드가 처리하는 고객에 대해 알 수 있도록하는 것입니다. 대개 로그인 한 사용자로부터 임차인을 파생시킬 수 있기 때문에 ThreadLocal에 인증 관련 정보를 입력하면됩니다.
이제 그 자리에 있다면 입주자 지식을 적용 할 수있는 몇 가지 옵션이 있습니다. 가장 일반적인 것들을 간략하게 요약 해 드리겠습니다.
여러 클라이언트의 데이터를 구분하는 한 가지 방법은 세입자별로 개별 데이터베이스를 만드는 것입니다. Spring 데이터 MongoDB의 핵심 추상화는 MongoDBFactory 인터페이스이다. 가장 쉬운 방법은 SimpleMongoDbFactory.getDb (String name)을 재정의하고 부모 메소드를 데이터베이스 이름 (예 : 세입자 접두사 등으로 풍부하게된다.
또 다른 옵션은 세입자에게 특정 컬렉션을 부여하는 것입니다. 임차인 선주 또는 후손을 통해 이 메커니즘은 @Document 주석의 collectionName 속성에서 Spring Expression Language (SpEl)을 사용하여 실제로 활용할 수 있습니다. 먼저 Spring 빈을 통해 테넌트 프리픽스를 노출합니다.
@Component("tenantProvider") public class TenantProvider { public String getTenantId() { // … implement ThreadLocal lookup here } }
그런 다음 @Document 매핑을 사용하여 도메인 유형에 SpEL을 사용하십시오.
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts" public class Account { … }
SpEl을 사용하면 스프링 빈을 이름으로 참조하고 메소드를 실행할 수 있습니다. MongoTemplate (따라서 저장소 추상화는 일시적으로) 문서 클래스의 매핑 메타 데이터를 사용할 것이고 매핑 하위 시스템은 collectionName 특성을 평가하여 상호 작용할 컬렉션을 찾습니다.
-
==============================
2.Oliver Gierke와 비슷한 접근 방식을 가졌습니다. 적어도 데이터베이스 수준. https://github.com/Loki-Afro/ultultant-spring-mongodb 이런 일을 할 수 있어야합니다 :
Oliver Gierke와 비슷한 접근 방식을 가졌습니다. 적어도 데이터베이스 수준. https://github.com/Loki-Afro/ultultant-spring-mongodb 이런 일을 할 수 있어야합니다 :
MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test"); this.personRepository.save(createPerson("Phillip", "Wirth", ChronoUnit.YEARS.between( LocalDate.of(1992, Month.FEBRUARY, 3), LocalDate.now()))); System.out.println("data from test: " + this.personRepository.findAll()); // okay? fine. - lets switch the database MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test666"); // should be empty System.out.println("data from test666: " + this.personRepository.findAll());
from https://stackoverflow.com/questions/16325606/making-spring-data-mongodb-multi-tenant by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 다른 메서드에서 호출 한 트랜잭션 메서드가 트랜잭션을 가져 오지 않습니다. (0) | 2018.12.15 |
---|---|
[SPRING] 스프링 부트로 Maven 리소스 필터링 : 자리 표시자를 해결할 수 없습니다. (0) | 2018.12.15 |
[SPRING] 스프링 데이터와 하이버 네이트를 사용할 때 어떻게 백그라운드 스레드를 올바르게 수행 할 수 있습니까? (0) | 2018.12.15 |
[SPRING] 내 웹 앱의 봄부터 '스레드 바운드 요청 없음'오류 발생 (0) | 2018.12.15 |
[SPRING] Spring Boot 2.0 마이그레이션 후 : driverClassName에 jdbcUrl이 필요합니다. (0) | 2018.12.15 |