1 回答

TA貢獻1806條經驗 獲得超5個贊
我的意思是,你已經找到了完成這項任務的最佳方法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());
}
}
添加回答
舉報