Я прочитал много вопросов и ответов о динамической маршрутизации данных и реализовал решение с использованием 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");
}
}