Изменение схемы базы данных во время выполнения на основе зарегистрированного пользователя
Я прочитал много вопросов и ответов о динамической маршрутизации источника данных и реализовал решение, используяAbstractRoutingDataSource
и другой (см. ниже). Это нормально, но требует жестко закодированных свойств для всех источников данных. Поскольку число пользователей, использующих приложение, увеличивается, это больше не подходит для маршрутизации. Также требуется добавить запись в свойства каждый раз, когда регистрируется новый пользователь. Ситуация следующая
я использую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");
}
}