2017-07-07 34 views
0

我已经开发了两个使用Spring Boot框架的Web服务,我在同一个项目中使用它们。每个Web服务使用不同的数据库,例如ws1使用Oracle1,而ws2使用Oracle2。我用beans定义了一个DataBaseConfig,但是当我运行这个应用程序时,总是使用一个web服务(并且它总是相同的)。SpringBoot的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。当我运行应用程序时,我没有与连接相关的错误,如果我将两个项目中的Web服务分开,每个都可以正常工作。

+0

而不是@Qualifier(“datasource”)和'@Qualifier(“secondDatasource”)'它应该是@Qualifier(“ora1”)和'@Qualifier(“ora2”)',不应该它? – alfcope

+0

我试过了,但仍然无法正常工作。工作的ws不是被设置为'Primary'的ws。我得到的web服务'客户端'的错误是ORA-00942:表或视图不存在,但查询工作正常(我也有在单独的项目中的Web服务工作正常) – lorenag83

回答

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); 
} 
+0

这没有把戏!谢谢 ! – lorenag83

0

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

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