我有一个带有休眠状态的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;
}
}
如果不清楚,我可以提供更多信息/代码。