Многопользовательский режим гибернации не переключается между арендаторами - PullRequest
0 голосов
/ 28 января 2020

Я нахожусь в процессе смены настройки весны + гибернации + mysql на мультитенанта. Прежде всего, в моем application.properties есть следующее:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=root

Я не уверен, должен ли я подключить его к указанной c схеме здесь (test) после вводит многопользовательский режим? Это не имеет смысла для меня, поскольку предполагается использовать схему по умолчанию, если арендатор не предоставлен, в противном случае подключитесь к схеме, связанной с арендатором. Однако, если я удаляю его, я получаю сообщение об ошибке, что база данных не была предоставлена.

Во-вторых, мультитенантная часть не работает. Все мои запросы выполняются в схеме test. Я реализовал следующее MultiTenantConnectionProvider:

@Component
public class TenantConnectionProvider implements MultiTenantConnectionProvider {
private Datasource datasource;

public TenantConnectionProvider(DataSource datasource) {
    this.datasource = datasource;
}

...

@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
    logger.info("Get connection for tenant {}", tenantIdentifier);
    final Connection connection = getAnyConnection();
    connection.setSchema(tenantIdentifier);
    return connection;
}

@Override
public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
    logger.info("Release connection for tenant {}", tenantIdentifier);
    connection.setSchema(DEFAULT_TENANT);
    releaseAnyConnection(connection);
}
}

Я не получаю ошибок, и когда я делаю запрос, он правильно печатает Get connection for tenant с правильным tenantIdentifier, который соответствует имени одного из моих другие схемы. Тем не менее, он запрашивает схему test. Что мне не хватает? Спасибо!

РЕДАКТИРОВАТЬ:

Кажется, что connection.setSchema(tenantIdentifier) не имеет никакого эффекта. В описании метода говорится следующее: If the driver does not support schemas, it will silently ignore this request. Значит, мой драйвер не поддерживает его? Что делать в этом случае?

1 Ответ

0 голосов
/ 28 января 2020

Использование connection.createStatement().execute("USE " + tenantIdentifier); вместо connection.setSchema(tenantIdentifier); решило мою проблему.

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