![](/img/trans.png)
[英]Multi-tenancy using single database multiple schema with Hibernate and Spring Boot saving data to wrong schema
[英]Multi-tenancy with a separate database per customer, using Spring Data ArangoDB
到目前為止,我知道設置數據庫名稱(與Spring Data ArangoDB一起使用)的唯一方法是在擴展AbstractArangoConfiguration
同時,在database()
方法中對其進行硬編碼,如下所示:
@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連接 -但特定於Spring Data ArangoDB。
事實證明這很簡單:只需更改ArangoConfiguration
database()
方法@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);
}
}
然后,可以在代碼中的任何位置(例如,在Servlet過濾器中)或在我的情況下,在Apache Camel路由處理器和數據庫服務方法中,使用此組件@Autowired
來設置數據庫名稱。
附言:通過閱讀ArangoTemplate代碼和Spring Expression支持文檔部分 ( 通過 )以及一個合並的pull request ,我意識到了這種可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.