2016-05-26 2 views
3

Приложение Spring Boot 1.3.3 сохраняет данные по MongoDB (2.6 ou 3.2) с использованием Spring Data MongoDB 1.8.4.Сбор данных на основе муфт с данными Spring MongoDB

Нам необходимо поддерживать многопользовательскую работу. Мы решили использовать «мультивенцию на основе коллекции», т. Е. Каждый арендатор имеет свой собственный набор коллекций. Например, для объекта Article эти коллекции являются «{tenantName} _articles».

Оливер Гирке любезно объяснил реализацию в Making spring-data-mongodb multi-tenant, используя, например:

@Document(collectionName = "#{tenantProvider.getTenantId()}_articles") 

Это очень хорошо на бумаге, но, кажется, не применимы для реальных приложений, я нашел две проблемы, одна из которых главная:

Выпуск 1 (я мог бы жить с этим): при запуске приложения Spring Boot заставляет базу данных строить индексы для объектов, у которых есть пользовательские индексы (такие как атрибуты @Indexed). Но при запуске нет «текущего арендатора», поэтому Spring Data создает нерелевантные коллекции, такие как «_articles». Как мы можем предотвратить это?

Выпуск 2 (основной Probleme здесь): во время исполнения Многоквартирный коллекции, такие как «{tenantName} _articles» создаются и используются без пользовательских индексов (кроме индекса MongoDB по умолчанию на «_id»). Я подозреваю, что Spring игнорирует индексы во время выполнения, потому что думает, что он уже выполнил работу при запуске. Это серьезная проблема с производительностью. Как мы можем это исправить?

Спасибо за ваше время.

ответ

4

Найден способ воссоздать индексы для данного жильца:

String tenantName = ...; 

MongoMappingContext mappingContext = (MongoMappingContext) mongoTemplate.getConverter().getMappingContext(); 
MongoPersistentEntityIndexResolver resolver = new MongoPersistentEntityIndexResolver(mappingContext); 

for (BasicMongoPersistentEntity entity : mappingContext.getPersistentEntities()) { 
    if (entity.findAnnotation(Document.class) == null) { 
     // Keep only collection roots 
     continue; 
    } 

    String collectionName = entity.getCollection(); 
    if (!collectionName.startsWith(tenantName)) { 
     // Keep only dynamic entities 
     continue; 
    } 

    IndexOperations indexOperations = mongoTemplate.indexOps(collectionName); 
    for (MongoPersistentEntityIndexResolver.IndexDefinitionHolder holder : resolver.resolveIndexForEntity(entity)) { 
     indexOperations.ensureIndex(holder.getIndexDefinition()); 
    } 
} 

мне потребовалось некоторое время, чтобы понять это. Надеюсь, это поможет. Усовершенствования приветствуются.

+0

Где написать этот код? Или укажите место для написания этого кода. – kamlesh0606

+0

Если ваши арендаторы могут быть зарегистрированы, этот код может быть, например, в процессе регистрации. –

Смежные вопросы