SpringBoot web 服务多个数据源只有一个工作

SpringBoot web services multiple data sources only one working

我使用 Spring Boot 框架开发了两个 Web 服务,并将它们放在同一个项目中。每个 web 服务使用不同的数据库,比如 ws1 使用 Oracle1 而 ws2 使用 Oracle2。我已经用 beans 定义定义了一个 DataBaseConfig,但是当我 运行 这个应用程序时,它总是运行一个网络服务(而且它总是一样的)。

数据库配置

@Configuration
public class DataBaseConfig {
@Bean(name = "ora1")
@ConfigurationProperties(prefix="spring.datasource") 
public DataSource mysqlDataSource() {
    return DataSourceBuilder.create().build();}

@Bean(name = "ora2")
@ConfigurationProperties(prefix="spring.secondDatasource") 
public DataSource sqliteDataSource() {
    return DataSourceBuilder.create().build();}

 @Bean(name = "clients")
    @Autowired
    @ConfigurationProperties(prefix = "spring.datasource")
    @Qualifier("datasource")
    public JdbcTemplate slaveJdbcTemplate(DataSource datasource) {
        return new JdbcTemplate(datasource); }

    @Bean(name = "places")
    @Autowired
     @Primary
        @ConfigurationProperties(prefix = "spring.secondDatasource")
     @Qualifier("secondDatasource")
    public JdbcTemplate masterJdbcTemplate(DataSource secondDatasource) {
        return new JdbcTemplate(secondDatasource);} 
} 

我有包含 sql 语句和定义

的服务定义
@Service
public class ClientsService {

@Autowired
@Qualifier("clients") 
private JdbcTemplate jdbcTemplate;

和其他服务

@Service
public class PlacesService {

@Autowired
@Qualifier("places") 
private JdbcTemplate jdbcTemplate;

然后在每个控制器中我都取消映射@RequestMapping。当我 运行 应用程序时,我没有与连接相关的错误,如果我将 web 服务分开在 2 个项目中,每个都可以正常工作。

这里有些地方出了问题,包括一些不必要的注释。见下文,注意@Qualifier 的位置和限定符名称:

@Bean(name = "clients")
public JdbcTemplate slaveJdbcTemplate(@Qualifier("ora1") DataSource datasource) {
     return new JdbcTemplate(datasource); 
}

@Bean(name = "places")
@Primary
public JdbcTemplate masterJdbcTemplate(@Qualifier("ora2") DataSource secondDatasource) {
    return new JdbcTemplate(secondDatasource);
}

为什么不使用构造函数注入并在配置 class 中创建服务(沟 @Service注解)。像往常一样创建 DataSourceJdbcTemplate bean,不要给它们任何名称(默认是方法名称),同时创建 new PlacesService(placesJdbcTemplate())。结果是代码简单了很多。

这是假设您希望两个数据库在运行时都处于活动状态。如果不是,请使用 @Profile.