在运行时根据登录用户更改数据库架构
我已经阅读了许多关于动态数据源路由的问题和答案,并实现了一个解决方案和另一个(见下文)。这很好,但需要所有数据源的硬编码属性。随着使用该应用程序的用户数量的增加,这不再是一种合适的路由方式。此外,每次新用户注册时,还需要向属性中添加一个条目。情况如下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");
}
}