I am trying to setup multiple data sources(MySql, Postgres & Oracle) using Spring boot. I am not using JPA. Setting up with a JdbcTemplate.
I have tried setting
My setup: spring-boot version 1.2.5.RELEASE
I succeeded in running a setup like this, with the jdbc being created with the correct DataSources by adding a @Qualifier in each JDBC method creation
So, for every JDBC method you should match the qualifying datasource like this
@Bean(name = "dJdbc")
public JdbcTemplate drupalJdbcTemplate(@Qualifier("dMySql") DataSource dMySql) {
return new JdbcTemplate(dMySql);
}
No matter you choose for @Primary, using the @Qualifier for every JDBC should work good. Autowiring jdbcTemplates in repositories, and using @Qualifier for them is ok also.
In your DAO you could wire in additional jdbctemplates. Then at runtime you can pick which one to use.
@Repository
public class DAOImpl implements DAOInterface {
@Autowired
@Qualifier("tOracle")
private JdbcTemplate testJdbc;
@Autowired
@Qualifier("intOracle")
private JdbcTemplate intJdbc;
@Override
public Map<String, Object> getBasicStudentInfo(String MAIL, String source) {
if ("TEST".equals(source)){
return testJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
}else {
return intJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
}
}
Here is complete solution to your problem ...
Your configuration classes will look like this :
MySqlConfiguration.java
@Configuration
public class MySqlConfiguration {
@Bean(name = "dMySql")
@ConfigurationProperties(prefix = "spring.datasource.d.int-mysql")
public DataSource mysqlDrupalDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dJdbc")
public JdbcTemplate drupalJdbcTemplate(@Qualifier("dMySql") DataSource dMySql) {
return new JdbcTemplate(dMySql);
}
@Bean(name = "mMySql")
@ConfigurationProperties(prefix = "spring.datasource.m.int-mysql")
public DataSource mysqlDrupalDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mJdbc")
public JdbcTemplate drupalJdbcTemplate(@Qualifier("mMySql") DataSource mMySql) {
return new JdbcTemplate(mMySql);
}
}
OracleConfiguration.java
@Configuration
public class OracleConfiguration {
@Primary
@Bean(name = "tOracle")
@ConfigurationProperties(prefix = "spring.datasource.test-oracle")
public DataSource heOracleDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "tOracleJdbc")
public JdbcTemplate jdbcTemplate(@Qualifier("tOracle") DataSource tOracle) {
return new JdbcTemplate(tOracle);
}
@Bean(name = "iOracle")
@ConfigurationProperties(prefix = "spring.datasource.int-oracle")
public DataSource heOracleDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "iOracleJdbc")
public JdbcTemplate jdbcTemplate(@Qualifier("iOracle") DataSource iOracle) {
return new JdbcTemplate(iOracle);
}
}
and in your DAO class , you can autowire the JdbcTemplate like this :
@Repository
public class DAOImpl implements DAOInterface {
@Autowired
@Qualifier("dJdbc")
private JdbcTemplate dJdbc;
@Autowired
@Qualifier("mJdbc")
private JdbcTemplate mJdbc;
@Autowired
@Qualifier("tOracleJdbc")
private JdbcTemplate tOracleJdbc;
@Autowired
@Qualifier("iOracleJdbc")
private JdbcTemplate iOracleJdbc;
@Override
public Map<String, Object> getBasicStudentInfo(String MAIL) {
return dJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
}
.
.
.
}
Note: Make Sure to annotate one of DataSource with @Primary annotation