为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Spring Data ArangoDB 为每个客户提供一个单独的数据库的多租户

使用 Spring Data ArangoDB 为每个客户提供一个单独的数据库的多租户

达令说 2022-12-28 16:40:30
到目前为止,我知道设置数据库名称以与 Spring Data ArangoDB 一起使用的唯一方法是database()在扩展时将其硬编码在方法中AbstractArangoConfiguration,如下所示:@Configuration@EnableArangoRepositories(basePackages = { "com.company.mypackage" })public class MyConfiguration extends AbstractArangoConfiguration {  @Override  public ArangoDB.Builder arango() {    return new ArangoDB.Builder();  }  @Override  public String database() {    // Name of the database to be used    return "example-database";  }}如果我想实现多租户,每个租户在单独的数据库中都有数据并使用例如子域来确定应该使用哪个数据库名称怎么办?Spring Data ArangoDB 使用的数据库可以在运行时动态确定吗?这个问题与这里的讨论有关:Manage multi-tenancy ArangoDB connection - but is Spring Data ArangoDB specific。
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

事实证明这非常简单:只需更改返回 Spring 表达式 (SpEL)的ArangoConfiguration database()方法:@Override


    @Override

    public String database() {

        return "#{tenantProvider.getDatabaseName()}";

    }

在这个例子中引用了一个TenantProvider @Component可以像这样实现的:


@Component

public class TenantProvider {


    private final ThreadLocal<String> databaseName;


    public TenantProvider() {

        super();

        databaseName = new ThreadLocal<>();

    }


    public String getDatabaseName() {

        return databaseName.get();

    }


    public void setDatabaseName(final String databaseName) {

        this.databaseName.set(databaseName);


    }

}


然后,该组件可以@Autowired位于代码中的任何位置以设置数据库名称,例如在 servlet 过滤器中,或者在我的例子中,在 Apache Camel 路由处理器和数据库服务方法中。


Ps 我通过阅读ArangoTemplate代码和Spring Expression 支持文档部分 (通过)以及一个合并的拉取请求意识到了这种可能性。



查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信