Spring Boot +具有多租户的Spring数据 [英] Spring Boot + Spring Data with multi tenancy
问题描述
是否可以将Spring Boot配置为使用MultiTenantConnectionProvider,以便我系统的每个客户端连接到他们自己的专用数据库?
具体而言,我正在寻求对多租户使用内置hibernate支持:
这是一个我之后的配置类型的例子,但我不知道如何在Spring Boot设置中使用它:
- <在多租户中管理连接共享池Web应用程序与Spring,Hibernate和C3P0
我已经尝试将这些属性添加到应用程序.properties
:
spring.jpa.hibernate.multiTenancy =数据库
spring.jpa .hibernate.tenant_identifier_resolver = com.mystuff.MyCurrentTenantIdentifierResol ver
spring.jpa.hibernate.multi_tenant_connection_provider = com.mystuff.MyMultiTenantConnectionProviderImplX
我已经也尝试编码我自己的 CurrentTenantIdentifierResolver
和 MultiTenantConnectionProvider
并尝试从我的主要@Configuration bean提供这些:
@Bean
public CurrentTenantIdentifierResolver currentTenantIdentifierResolver(){
return new CurrentTenantIdentifierResolver(){
public String resolveCurrentTenantIdentifier (){
//这个永远不会被调用...
}
public boolean validateExistingCurrentSessions(){
//这不会被调用...
}
};
$ b @Bean
public MultiTenantConnectionProvider multiTenantConnectionProvider(){
return new AbstractMultiTenantConnectionProvider(){
protected ConnectionProvider getAnyConnectionProvider(){
/ /这是从来没有调用...
}
保护ConnectionProvider selectConnectionProvider(String s){
//这永远不会被调用...
}
};
}
这似乎没有任何影响,所以我的问题是如何获得spring-boot / spring-data使用这些多租户类?
感谢您的帮助!
未定义的JPA / Hibernate的任何属性可以使用 spring.jpa.properties
属性 application.properties
。
您链接的示例有3个多租户的属性:
< prop key =hibernate.multiTenancy> SCHEMA< /丙>
< 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中的以下属性
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
p $ p
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,因为hibernate控制着生命周期清除这些实例。
更多属性请参阅Spring Boot 参考指南。
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:
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:
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
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 ...
}
};
}
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?
Thanks for your help!
Any property for JPA/Hibernate that isn't defined can be set using the spring.jpa.properties
property in the application.properties
.
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>
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
It will not work with Spring manged beans as hibernate controls the lifecycle of those instances.
For more properties see the the Spring Boot reference guide.
这篇关于Spring Boot +具有多租户的Spring数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!