[英]Spring Boot 1 database multiple database users
我目前正在構建一個訪問數據庫的安靜的 API(帶有 Spring 引導)。 此應用程序最終將托管在服務器上。
我想做的事:
我該如何配置上面的應用程序?
到目前為止我找到的答案涉及配置多個數據源,但是對於上述應用程序,只有一個數據源,但有多個用戶。
我已閱讀以下鏈接,但仍在嘗試理解它
https://kimrudolph.de/blog/spring-datasource-routing
我是否使用相同的 URL(在本例中為 jdbcURL)配置多個數據源,並為每個角色配置多組用戶名和密碼?
謝謝!
您已經找到了完成該任務的最佳方法,我的意思是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());
}
}
我會定義多個DataSource
,每個都有不同的用戶,但指向相同的(數據庫)地址。 您可以按如下方式定義自定義DataSource
:
@Bean
@Qualifier("userOneDataSource")
public DataSource userOneDataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("your.driver.class");
dataSourceBuilder.url("jdbc:same:url/here");
dataSourceBuilder.username("User1");
dataSourceBuilder.password("Pass1");
return dataSourceBuilder.build();
}
您可以根據需要定義任意數量。 從那里,您可以為每個DataSource
創建多個JdbcTemplate
或JpaRepository
:
@Repository
public class UserOneDao extends JdbcDaoSupport {
@Autowired
public UserOneDao(@Qualifier("userOneDataSource") DataSource dataSource){
setDataSource(dataSource);
}
}
@Repository
public class UserTwoDao extends JdbcDaoSupport {
@Autowired
public UserOneDao(@Qualifier("userTwoDataSource") DataSource dataSource){
setDataSource(dataSource);
}
}
並且從您的@Controller
中,您可以調用您想要的任何 DAO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.