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

Multi-tenancy with a separate database per customer, using 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 - 但 Spring Data ArangoDB 特定。

事实证明这非常简单:只需将 ArangoConfiguration database() 方法 @Override 更改为 return 一个 Spring 表达式 (SpEL):

    @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 路由处理器和数据库服务方法中。

P.s。通过阅读 ArangoTemplate code and a Spring Expression support documentation section,我意识到了这种可能性 (via), and one merged pull request.