问题描述
是否可以将 Spring Boot 配置为使用 MultiTenantConnectionProvider 以便我系统的每个客户端都连接到自己的私有数据库?
Is it possible to configure Spring Boot to use a MultiTenantConnectionProvider so that each client of my system connects to their own private database?
具体来说,我希望使用内置的休眠支持来支持多租户:
Specifically I am looking to use the built-in hibernate support for multi-tenancy:
- http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4561
这是我所追求的那种配置的一个例子,但我不知道如何在 Spring Boot 设置中使用它:
And this is an example of the sort of config I am after, but I can't figure out how to use this in a Spring Boot setup:
- 管理连接池在带有 Spring、Hibernate 和 C3P0 的多租户 Web 应用中
我尝试将这些属性添加到 application.properties
:
I've tried adding these properties to application.properties
:
spring.jpa.hibernate.multiTenancy=DATABASE
spring.jpa.hibernate.tenant_identifier_resolver=com.mystuff.MyCurrentTenantIdentifierResolver
spring.jpa.hibernate.multi_tenant_connection_provider=com.mystuff.MyMultiTenantConnectionProviderImplX
我也尝试编写自己的 CurrentTenantIdentifierResolver
和 MultiTenantConnectionProvider
并尝试从我的主 @Configuration bean 提供这些:
I've also tried coding up my own CurrentTenantIdentifierResolver
and MultiTenantConnectionProvider
and tried serving these up from my main @Configuration bean:
@Bean
public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
return new CurrentTenantIdentifierResolver() {
public String resolveCurrentTenantIdentifier() {
// this is never called ...
}
public boolean validateExistingCurrentSessions() {
// this is never called ...
}
};
}
@Bean
public MultiTenantConnectionProvider multiTenantConnectionProvider() {
return new AbstractMultiTenantConnectionProvider() {
protected ConnectionProvider getAnyConnectionProvider() {
// this is never called ...
}
protected ConnectionProvider selectConnectionProvider(String s) {
// this is never called ...
}
};
}
这些似乎都没有任何影响,所以我的问题是如何让 spring-boot/spring-data 使用这些多租户类?
None of this seems to have any affect so my question is really how to get spring-boot / spring-data to use these multi-tenant classes?
感谢您的帮助!
推荐答案
任何未定义的 JPA/Hibernate 属性 都可以使用 spring.jpa.properties 进行设置
属性.application.properties
中的
Any property for JPA/Hibernate that isn't defined can be set using the spring.jpa.properties
property in the application.properties
.
您链接到的示例具有 3 个多租户属性:
The sample you link to has 3 properties for multitenancy:
<prop key="hibernate.multiTenancy">SCHEMA</prop>
<prop key="hibernate.tenant_identifier_resolver">com.webapp.persistence.utility.CurrentTenantContextIdentifierResolver</prop>
<prop key="hibernate.multi_tenant_connection_provider">com.webapp.persistence.utility.MultiTenantContextConnectionProvider</prop>
转换为 Spring Boot 的将是 application.properties
文件中的以下属性.
That converted to Spring Boot would be the following properties in the application.properties
file.
spring.jpa.properties.hibernate.multiTenancy=SCHEMA
spring.jpa.properties.hibernate.tenant_identifier_resolver=com.mystuff.MyCurrentTenantIdentifierResolver
spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.webapp.persistence.utility.MultiTenantContextConnectionProvider
针对您的情况(如您的问题所述).
For your situation (as stated in your question).
spring.jpa.properties.hibernate.multiTenancy=DATABASE
spring.jpa.properties.hibernate.tenant_identifier_resolver=com.webapp.persistence.utility.CurrentTenantContextIdentifierResolver
spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.mystuff.MyMultiTenantConnectionProviderImplX
它不适用于 Spring 管理的 bean,因为休眠控制这些实例的生命周期.
It will not work with Spring manged beans as hibernate controls the lifecycle of those instances.
有关更多属性,请参阅 Spring Boot 参考指南.
For more properties see the the Spring Boot reference guide.
这篇关于Spring Boot + Spring Data 多租户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!