2016-05-26 8 views
3

SpringBlock 1.3.3アプリケーションは、SpringデータMongoDB 1.8.4を使用してMongoDB(2.6 ou 3.2)のデータを維持します。SpringデータMongoDBを使用したコレクションベースのマルチテナンシー

マルチテナントをサポートする必要があります。私たちは、「コレクションベース」のマルチテナントを使用することを選択しました。つまり、各テナントには独自のコレクションセットがあります。たとえば、Articleエンティティの場合、コレクションは "{tenantName} _articles"です。

オリバーギールケは親切例えば使用Making spring-data-mongodb multi-tenantで実装を説明した:

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

これは紙の上で非常にいいですが、私は二つの問題、1が主要なもの見られるような現実のアプリケーションに適用できていないようだ。

Issue 1:私はそれを生きることができました。アプリケーションの起動時にSpringブートはデータベースにカスタムインデックス(@Indexed属性など)を持つエンティティのインデックスを作成させます。しかし、スタートアップ時には、 "現在のテナント"は存在しないため、Spring Dataは "_articles"などの無関係なコレクションを作成します。どうしたらこれを防ぐことができますか?

問題2(ここでは主要なprobleme):実行時のようなマルチテナントコレクションに作成されている「{tenantNameは} _articles」とカスタムインデックスなしを使用(別に「_id」でデフォルトのMongoDBインデックスから)。私は実行時に既に起動時に仕事をしたと考えているので、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

テナントを登録することができれば、このコードは登録プロセスに入れることができます。 –

関連する問題