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

Java 使用Spring Data ArangoDB,为每个客户提供单独数据库的多租户,java,spring-data,arangodb,Java,Spring Data,Arangodb,到目前为止,我所知道的设置数据库名称的唯一方法是在扩展AbstractArangoConfiguration的同时,在database()方法中对其进行硬编码,以用于Spring数据ArangoDB,如下所示: @Configuration @EnableArangoRepositories(basePackages = { "com.company.mypackage" }) public class MyConfiguration extends AbstractArangoConfigur

到目前为止,我所知道的设置数据库名称的唯一方法是在扩展
AbstractArangoConfiguration
的同时,在
database()
方法中对其进行硬编码,以用于Spring数据ArangoDB,如下所示:

@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使用的数据库能否在运行时动态确定


这个问题与这里的讨论有关:-但是Spring数据是ArangoDB特有的。

结果很简单:只需更改
ArangoConfiguration
数据库()
方法
@Override
即可返回Spring表达式(SpEL):

在本例中,它引用了一个
TenantProvider
@组件
,可以这样实现:

@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);

    }
}

@组件
公屋租户提供者{
私有本地数据库名;
公共租客提供者(){
超级();
databaseName=新的ThreadLocal();
}
公共字符串getDatabaseName(){
返回databaseName.get();
}
public void setDatabaseName(最终字符串databaseName){
this.databaseName.set(databaseName);
}
}
然后,该组件可以在代码中的任何位置进行
@Autowired
,以设置数据库名称,例如在servlet过滤器中,或者在我的例子中在Apache Camel route处理器和数据库服务方法中

另外,我通过阅读代码和
(),和。

实现多租户的另一个选项是为每个文档和所有查询谓词添加租户密钥,但每个租户之间的分隔不太“干净”,每个租户的数据库似乎是ArangoDB首选的方法:“不同的数据库通常用于多租户设置,因为其中的数据(收集、文件等)彼此隔离。”-
@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);

    }
}