Многопользовательская схема на основе Spring и Hibernate - PullRequest
0 голосов
/ 30 января 2020

У меня есть приложение 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;
    }
}

Если что-то неясно, я могу предоставить дополнительную информацию / код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...