Spring boot - how to configure multiple datasources

后端 未结 3 1336
野性不改
野性不改 2020-12-19 19:48

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

相关标签:
3条回答
  • 2020-12-19 20:07

    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.

    0 讨论(0)
  • 2020-12-19 20:11

    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});       
        }
    }
    
    0 讨论(0)
  • 2020-12-19 20:14

    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

    0 讨论(0)
提交回复
热议问题