2015-07-20 38 views
0

我有一个ReST服务需要从两个不同的数据库(Oracle和MySQL)中获取数据并将这些数据合并到响应中。Spring引导 - 多个DataSource的问题

我有下面的配置。

配置为DB 1:

@Configuration 
public class DbConfig_DB1{ 

    @Bean(name="siebelDataSource") 
    public EmbeddedDatabase siebelDataSource(){ 
     return new EmbeddedDatabaseBuilder(). 
       setType(EmbeddedDatabaseType.H2). 
       addScript("schema.sql"). 
       addScript("test-data.sql"). 
       build(); 

    } 

    @Autowired 
    @Qualifier("siebelDataSource") 
    @Bean(name = "siebelJdbcTemplate") 
    public JdbcTemplate siebelJdbcTemplate(DataSource siebelDataSource) { 
     return new JdbcTemplate(siebelDataSource); 
    } 
} 

配置了DB2:

@Configuration 
public class DbConfig_DB2{  
    @Bean(name="brmDataSource") 
    public EmbeddedDatabase brmDataSource(){ 
     return new EmbeddedDatabaseBuilder(). 
       setType(EmbeddedDatabaseType.H2). 
       addScript("schema-1.sql"). 
       addScript("test-data-1.sql"). 
       build(); 

    } 

    @Autowired 
    @Qualifier("brmDataSource") 
    @Bean(name = "brmJdbcTemplate") 
    public JdbcTemplate brmJdbcTemplate(DataSource brmDataSource) { 
     return new JdbcTemplate(brmDataSource); 
    } 
} 

数据访问:

@Repository 
public class SiebelDataAccess { 
    protected final Logger log = LoggerFactory.getLogger(getClass()); 

    @Autowired 
    @Qualifier("siebelJdbcTemplate") 
    protected JdbcTemplate jdbc; 

    public String getEmpName(Integer id) { 

     System.out.println(jdbc.queryForObject("select count(*) from employee", Integer.class)); 

     Object[] parameters = new Object[] { id }; 
     String name = jdbc.queryForObject(
       "select name from employee where id = ?", parameters, 
       String.class); 
     return name; 
    } 

} 

我不能够启动的应用程序,因为我下面的错误:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration.dataSource; 

nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: brmDataSource,siebelDataSource 

问题出在上下文中的两个DataSource bean。如何解决这个问题?

回答

3

您可以将其中一个标记为@Primary,以便事务管理器的Spring Boot自动配置知道选择哪一个。如果您需要管理与他们双方的交易,那么恐怕您必须明确设置交易管理。

请参考Spring引导documentation

Creating more than one data source works the same as creating the first one. You might want to mark one of them as @Primary if you are using the default auto-configuration for JDBC or JPA (then that one will be picked up by any @Autowired injections).

+0

所以测试我跑了两个H2实例相同的SQL模式和contetns。显然他们被覆盖。有没有办法在内存中有两个H2实例? – sreehari

+0

您是否曾尝试在'EmbeddedDatabaseBuilder'上调用'setName()'?否则,它会在两种情况下使用相同的数据库名称,并针对相同的数据库执行模式脚本 –

+0

我试过了,这不起作用。 – sreehari