Spring Boot + Spring Data 多租户 [英] Spring Boot + Spring Data with multi tenancy

查看:82
本文介绍了Spring Boot + Spring Data 多租户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以将 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:

这是我所追求的那种配置的一个例子,但我不知道如何在 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:

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

我也尝试编写自己的 CurrentTenantIdentifierResolverMultiTenantConnectionProvider 并尝试从我的主 @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 多租户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆