我有一个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。如何解决这个问题?
所以测试我跑了两个H2实例相同的SQL模式和contetns。显然他们被覆盖。有没有办法在内存中有两个H2实例? – sreehari
您是否曾尝试在'EmbeddedDatabaseBuilder'上调用'setName()'?否则,它会在两种情况下使用相同的数据库名称,并针对相同的数据库执行模式脚本 –
我试过了,这不起作用。 – sreehari