java - Spring Boot + Spring Data Multi-Tenancy

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

具体来说,我希望使用内置的 hibernate 支持来支持 Multi-Tenancy :

  • http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4561

这是我所追求的那种配置的一个例子,但我不知道如何在 Spring Boot 设置中使用它:

  • Manage Connection Pooling in multi-tenant web app with Spring, Hibernate and C3P0

我尝试将这些属性添加到 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 使用这些 Multi-Tenancy 类?

感谢您的帮助!

最佳答案

Any property对于未定义的 JPA/Hibernate,可以使用 application.properties 中的 spring.jpa.properties 属性进行设置。

您链接到的示例具有 3 个 Multi-Tenancy 属性:

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

更多属性参见 Spring Boot reference guide .

关于java - Spring Boot + Spring Data Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898896/

相关文章:

java - 使用具有不同 AuthenticationProviders 的多个 WebSecur

spring - jar 如何在使用它的 Web 应用程序中传播漏洞?

java - Spring Integration Kafka Consumer Listener

java - Spring MVC 3.2 - 错误页面的内容协商?

spring - 如何在运行时将新用户添加到 Spring Security

java - 单个 hibernate session 中的多个事务(使用 Spring)

java - 使用spring boot(安全)和keycloak启用角色身份验证?

spring - Spring JUnit 测试中的自动模拟实例化

java - Spring 验证与 Hibernate 验证

java - Spring WS : How to get and save XSD validat