到目前为止,我知道设置要与Spring Data ArangoDB一起使用的数据库名称的唯一方法是,在扩展database()
的同时,用AbstractArangoConfiguration
方法对其进行硬编码,如下所示: / p>
@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。
答案 0 :(得分:0)
结果非常简单:只需更改ArangoConfiguration
database()
方法@Override
即可返回Spring Expression(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代码和Spring Expression support documentation section,我意识到了这种可能性 (via)和one merged pull request。