2017-07-07 30 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