我目前正在构建一个宁静的API(使用Spring Boot)来访问数据库。该应用程序最终将托管在服务器上。
我想做什么:
我该如何配置上面的应用程序?
到目前为止,我找到的答案涉及配置多个数据源,但是对于上述应用程序,只有一个数据源,但是有多个用户。
我已阅读以下链接,但仍在尝试了解它
https://kimrudolph.de/blog/spring-datasource-routing
我是否使用相同的URL(在本例中为jdbcURL)配置多个数据源,并为每个角色配置多组用户名和密码?
谢谢!
答案 0 :(得分:2)
您已经找到了完成该任务的最佳方法,我是说AbstractRoutingDataSource
。如果您的用户数量固定,这是使用以下方法的最简单方法:
public final class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return UserContextHolder.getUserName() + "DataSource";
}
}
和配置:
@Bean
@Qualifier("user1DataSource")
public DataSource userOneDataSource() {
return DataSourceBuilder.create()
.username("user1")
.password("pass")
...
.build();
}
@Bean
@Qualifier("user2DataSource")
public DataSource userOneDataSource() {
return DataSourceBuilder.create()
.username("user2")
...
.build();
}
@Bean
@Primary
public RoutingDataSource dataSource(Map<String, DataSource> datasources) {
return new RoutingDataSource().dataSource(datasources);
}
如果您需要在运行时添加用户和数据源,则可以使用以下代码:
public final class RoutingDataSource extends AbstractRoutingDataSource {
private final ConcurrentHashMap<String, DataSource> dynamicDataSources = new ConcurrentHashMap<>();
@Override
protected Object determineCurrentLookupKey() {
return UserContextHolder.getUserName() + "_datasource";
}
@Override
protected DataSource determineTargetDataSource() {
String currentLookupKey = this.determineCurrentLookupKey().toString();
String userName = UserContextHolder.getUserName();
String password = UserContextHolder.getPassword();
return this.dynamicDataSources.computeIfAbsent(currentLookupKey, (key) -> DataSourceBuilder.create()
.driverClassName("your.driver.class")
.url("jdbc:same:url/here")
.username(userName)
.password(password)
.build());
}
}