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

时间:2017-07-07 14:48:29

标签: spring spring-boot spring-jdbc

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

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。当我运行应用程序时,我没有与连接相关的错误,如果我将2个项目中的webservices分开,每个都可以正常工作。

2 个答案:

答案 0 :(得分:0)

这里有一些问题,包括一些不必要的注释。请参阅下文,注意@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);
}

答案 1 :(得分:0)

不是通过bean名称解析,这是一个坏主意IMO,因为它不是类型安全的,为什么不使用构造函数注入并在配置类中创建服务(ditch @Service注解)。像往常一样创建DataSourceJdbcTemplate bean,不要给它们任何名称(默认是方法名称),还要创建new PlacesService(placesJdbcTemplate())。结果是更简单的代码。

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