具有多租户的Spring Boot + Spring数据

时间:2014-11-12 23:51:34

标签: java spring hibernate spring-data spring-boot

是否可以将Spring Boot配置为使用MultiTenantConnectionProvider,以便我系统的每个客户端都连接到自己的私有数据库?

具体来说,我希望使用内置的hibernate支持多租户:

这是我所追求的那种配置的一个例子,但我无法弄清楚如何在Spring Boot设置中使用它:

我已尝试将这些属性添加到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

我还尝试编写自己的CurrentTenantIdentifierResolverMultiTenantConnectionProvider,并尝试从我的主@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使用这些多租户类?

感谢您的帮助!

1 个答案:

答案 0 :(得分:8)

对于未定义的JPA / Hibernate的

Any property可以使用spring.jpa.properties中的application.properties属性进行设置。

您链接的示例有3个多租户属性:

<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文件中的以下属性。

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

根据您的情况(如您的问题所述)。

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 manged beans,因为hibernate控制这些实例的生命周期。

有关更多属性,请参阅Spring Boot reference guide