【发布时间】:2016-09-24 09:30:39
【问题描述】:
我们的 Spring Boot 1.3.3 应用程序使用 Spring Data MongoDB 1.8.4 在 MongoDB (2.6 或 3.2) 上持久化数据。
我们需要支持多租户。我们选择使用“基于集合”的多租户,即每个租户都有自己的集合集。例如,对于 Article 实体,集合是“{tenantName}_articles”。
Oliver Gierke 在Making spring-data-mongodb multi-tenant 中解释了一个实现,例如:
@Document(collectionName = "#{tenantProvider.getTenantId()}_articles")
这在纸面上非常好,但似乎不适用于现实生活中的应用,因为我发现了两个问题,一个是主要问题:
问题 1(我可以忍受):在应用程序启动时,Spring Boot 使数据库为具有自定义索引(例如 @Indexed 属性)的实体构建索引。但是在启动时,没有“当前租户”,因此 Spring Data 创建了不相关的集合,例如“_articles”。我们如何防止这种情况发生?
问题 2(这里的主要问题):在运行时创建和使用诸如“{tenantName}_articles”之类的多租户集合没有自定义索引(除了“_id”上的默认 MongoDB 索引)。我怀疑 Spring 在运行时会忽略索引,因为它认为它在启动时已经完成了这项工作。这是一个主要的性能问题。我们该如何解决这个问题?
感谢您的宝贵时间。
【问题讨论】:
标签: mongodb spring-data multi-tenant spring-data-mongodb