gpt4 book ai didi

java - 制作 spring-data-mongodb Multi-Tenancy

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:42 26 4
gpt4 key购买 nike

post 中去年八月 sbzoom提出了使spring-data-mongoDB Multi-Tenancy 的方案:

“您必须制作自己的 RepositoryFactoryBean。这是来自 Spring Data MongoDB Reference Docs 的示例。您仍然需要实现自己的 MongoTemplate 并延迟或删除 ensureIndexes() 调用。但是您将不得不重写一些类以确保调用您的 MongoTemplate 而不是 Spring 的。”

有没有人实现这个或类似的东西?

最佳答案

这里有很多方法可以给猫剥皮。这基本上都归结为您希望在哪个级别应用租赁。

基础知识

基本方法是在每个线程的基础上绑定(bind)某种识别客户的键,这样您就可以了解当前执行线程处理的客户。这通常是通过使用一些身份验证相关信息填充 ThreadLocal 来实现的,因为您通常可以从登录用户派生租户。

现在,如果已经准备就绪,则可以通过多种方式应用租户知识。让我简要概述最常见的:

数据库级别的 Multi-Tenancy

为多个客户端分离数据的一种方法是为每个租户拥有单独的数据库。 Spring Data MongoDB 对此的核心抽象是 MongoDBFactory 接口(interface)。这里最简单的方法是覆盖 SimpleMongoDbFactory.getDb(String name) 并使用数据库名称调用父方法,例如由租户前缀等丰富。

集合级别的 Multi-Tenancy

另一种选择是拥有特定于租户的集合,例如通过租户前缀或后缀。通过在 @Document 注释的 collectionName 属性中使用 Spring 表达式语言 (SpEl),实际上可以利用此机制。首先,通过 Spring bean 公开租户前缀:

 @Component("tenantProvider")
public class TenantProvider {

public String getTenantId() {
// … implement ThreadLocal lookup here
}
}

然后在你的域类型中使用 SpEL @Document 映射:

 @Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }

SpEl 允许您通过名称引用 Spring bean 并在其上执行方法。 MongoTemplate(因此存储库抽象传递)将使用文档类的映射元数据,映射子系统将评估 collectionName 属性以找出要与之交互的集合.

关于java - 制作 spring-data-mongodb Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com