到目前为止,我知道设置数据库名称以与 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 使用的数据库可以在运行时动态确定吗?
这个问题与这里的讨论相关:管理多租户 ArangoDB 连接 https://stackoverflow.com/questions/48174019/manage-multi-tenancy-arangodb-connection- 但是 Spring Data ArangoDB 是特定的。
事实证明这非常简单:只需更改ArangoConfiguration
database()
method @Override
返回 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 路由处理器和数据库服务方法中。
附注我通过阅读以下内容意识到了这种可能性Arango模板 https://github.com/arangodb/spring-data/blob/master/src/main/java/com/arangodb/springframework/core/template/ArangoTemplate.java#L130代码和一个Spring 表达式支持文档部分 https://github.com/arangodb/spring-data/blob/master/docs/Drivers/SpringData/Reference/Mapping/Document.md#spring-expression-support
(via https://github.com/arangodb/spring-data/issues/145), and 一个合并的拉取请求 https://github.com/arangodb/spring-data/pull/103.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)