基于Spring和Hibernate的多租户架构

时间:2020-01-30 11:31:47

标签: java spring hibernate multi-tenant

我有一个带有休眠状态的Spring应用程序,用于访问数据库中的数据。 我尝试实现一个基于架构的多租户解决方案,其中每个客户都有自己的架构。

出了什么问题: 接到创建新客户的电话时,我必须做两件事: 首先,我需要为客户创建一个架构,然后我需要在该架构中创建所有表。 对于新客户,架构已设置为PUBLIC,因此创建架构没有问题。 但是在创建架构后,我需要在此新架构中创建表,因此需要使用正确的架构集获得新的连接。 但是在我的Spring应用程序中,我无法在请求中更改架构,因此,当我尝试在新架构中创建表时,总是为PUBLIC架构创建表。

另一个类似的问题: 已知用户发出了他的第一个请求,因此我必须查看PUBLIC模式中的表,该模式已连接到该用户。得到正确的架构后,我需要访问特定于用户的架构中的数据,但是此请求的架构已设置为PUBLIC,因此无法访问特定于用户的架构中的数据。

一些我用来解析连接模式的类:

public class TenantSchemaResolver implements CurrentTenantIdentifierResolver {

    @Override
    public String resolveCurrentTenantIdentifier() {
        String t = TenantContext.getCurrentTenant();
        if (t != null) {
            return t;
        } else {
            return TenantContext.DEFAULT_TENANT;
        }
    }

    @Override
    public boolean validateExistingCurrentSessions() {
        return true;
    }
}
public class TenantConnectionProvider implements MultiTenantConnectionProvider {    
    @Override
    public Connection getConnection(String tenantIdentifier) throws SQLException {
        final Connection connection = getAnyConnection();
        connection.setSchema(tenantIdentifier);        
        return connection;
    }
}

如果不清楚,我可以提供更多信息/代码。

0 个答案:

没有答案