Изменение схемы базы данных во время выполнения на основе зарегистрированного пользователя

Я прочитал много вопросов и ответов о динамической маршрутизации источника данных и реализовал решение, используяAbstractRoutingDataSource и другой (см. ниже). Это нормально, но требует жестко закодированных свойств для всех источников данных. Поскольку число пользователей, использующих приложение, увеличивается, это больше не подходит для маршрутизации. Также требуется добавить запись в свойства каждый раз, когда регистрируется новый пользователь. Ситуация следующая

1 сервер базы данныхМногие схемы на этом сервере, каждый пользователь имеет свою собственную схему.Мне нужно только изменить имя схемы во время выполненияИмя схемы может быть сохранено вошедшим в систему пользователем.

я используюspring boot 1.4.0 вместе сhibernate 5.1 а такжеspring data jpa

Я не могу найти способ изменить схему, полностью динамически. Кто-нибудь знает, как это сделать весной?

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

Благодаря ответу @Johannes Leimer я получил рабочую реализацию.

Вот код:

Пользователь провайдер:

@Component
public class UserDetailsProvider {
    @Bean
    @Scope("prototype")
    public CustomUserDetails customUserDetails() {
        return (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

UserSchemaAwareRoutingDatasource:

public class UserSchemaAwareRoutingDataSource extends AbstractDataSource {
@Inject
Provider<CustomUserDetails> customUserDetails;

@Inject
Environment env;
private LoadingCache<String, DataSource> dataSources = createCache();

@Override
public Connection getConnection() throws SQLException {
    try {
        return determineTargetDataSource().getConnection();
    } catch (ExecutionException e){
        e.printStackTrace();

        return null;
    }
}

@Override
public Connection getConnection(String username, String password) throws SQLException {
    System.out.println("getConnection" + username);
    System.out.println("getConnection2" + password);
    try {
        return determineTargetDataSource().getConnection(username, password);
    } catch (ExecutionException e) {
        e.printStackTrace();
        return null;
    }
}

private DataSource determineTargetDataSource() throws SQLException, ExecutionException {
    try {
        String schema = customUserDetails.get().getUserDatabase();
        return dataSources.get(schema);
    } catch (NullPointerException e) {
        e.printStackTrace();

        return dataSources.get("fooooo");
    }

}

Ответы на вопрос(2)

Ваш ответ на вопрос