У меня есть приложение Spring с Hibernate для доступа к данным в базе данных. Я пытаюсь реализовать мультитенантное решение на основе схемы, где у каждого клиента есть своя собственная схема.
В чем проблема: когда мне звонят, чтобы создать нового клиента, мне приходится делать две разные вещи: сначала мне нужно создать схему для клиента, и после этого мне нужно создать все таблицы в этой схеме. Для нового клиента схема имеет значение PUBLI C, поэтому создание схемы не является проблемой. Но после того, как я создал схему, мне нужно создать таблицы в этой новой схеме, и, следовательно, мне нужно получить новое соединение с правильным набором схемы. Но в моем приложении Spring я не могу изменить схему в запросе, поэтому при попытке создать таблицы в новой схеме они всегда создаются для схемы PUBLI C.
Еще одна похожая проблема: Известный пользователь делает свой первый запрос, поэтому мне нужно посмотреть в таблице в схеме PUBLI C, какая схема связана с этим пользователем. После того, как я получил правильную схему, мне нужно получить доступ к данным в пользовательской схеме c, но схема для этого запроса уже установлена в PUBLI C, поэтому я не могу получить доступ к данным в пользовательской схеме c .
Некоторые классы, которые я использую для разрешения схемы соединения:
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;
}
}
Если что-то неясно, я могу предоставить дополнительную информацию / код.