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

到目前为止,我知道设置数据库名称以与 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。



达令说
浏览 97回答 1
1回答

子衿沉夜

事实证明这非常简单:只需更改返回 Spring 表达式 (SpEL)的ArangoConfiguration database()方法:@Override&nbsp; &nbsp; @Override&nbsp; &nbsp; public String database() {&nbsp; &nbsp; &nbsp; &nbsp; return "#{tenantProvider.getDatabaseName()}";&nbsp; &nbsp; }在这个例子中引用了一个TenantProvider @Component可以像这样实现的:@Componentpublic class TenantProvider {&nbsp; &nbsp; private final ThreadLocal<String> databaseName;&nbsp; &nbsp; public TenantProvider() {&nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; &nbsp; &nbsp; databaseName = new ThreadLocal<>();&nbsp; &nbsp; }&nbsp; &nbsp; public String getDatabaseName() {&nbsp; &nbsp; &nbsp; &nbsp; return databaseName.get();&nbsp; &nbsp; }&nbsp; &nbsp; public void setDatabaseName(final String databaseName) {&nbsp; &nbsp; &nbsp; &nbsp; this.databaseName.set(databaseName);&nbsp; &nbsp; }}然后,该组件可以@Autowired位于代码中的任何位置以设置数据库名称,例如在 servlet 过滤器中,或者在我的例子中,在 Apache Camel 路由处理器和数据库服务方法中。Ps 我通过阅读ArangoTemplate代码和Spring Expression 支持文档部分&nbsp;(通过)以及一个合并的拉取请求意识到了这种可能性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java