Multiple DataSource and JdbcTemplate in Spring Boot (> 1.1.0)

40,083

Solution 1

Try to move @Qualifier annotation to the parameter on your @Bean methods for JdbcTemplate.

I guess, when you remove @Primary you end up with error, where more than one appropriate beans are presented

Solution 2

It should looks like this:

@Bean(name = "jdbcSlave")
@Autowired
public JdbcTemplate slaveJdbcTemplate(@Qualifier("dsSlave") DataSource dsSlave) {
    return new JdbcTemplate(dsSlave);
}
Share:
40,083
Xavier
Author by

Xavier

Updated on September 28, 2020

Comments

  • Xavier
    Xavier over 3 years

    I would like to inject a specific JdbcTemplatein a Spring Boot project. I tried to follow this example for multiple DataSourceconfiguration : http://spring.io/blog/2014/05/27/spring-boot-1-1-0-m2-available-now

    My code does compile and run, but only the DataSource with the @Primaryannotation is taken into account, no matter what I put as @Qualifier in the SqlServiceclass. My relevant code is the following :

    DatabaseConfig.java:

    @Configuration
    public class DatabaseConfig {
    
        @Bean(name = "dsSlave")
        @ConfigurationProperties(prefix="spring.mysql_slave")
        public DataSource slaveDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "dsMaster")
        @Primary
        @ConfigurationProperties(prefix="spring.mysql_master")
        public DataSource masterDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "jdbcSlave")
        @Autowired
        @Qualifier("dsSlave")
        public JdbcTemplate slaveJdbcTemplate(DataSource dsSlave) {
            return new JdbcTemplate(dsSlave);
        }
    
        @Bean(name = "jdbcMaster")
        @Autowired
        @Qualifier("dsMaster")
        public JdbcTemplate masterJdbcTemplate(DataSource dsMaster) {
            return new JdbcTemplate(dsMaster);
        }
    
    }
    

    And I did a quick service to try it out :

    SqlService.java:

    @Component
    public class SqlService {
    
        @Autowired
        @Qualifier("jdbcSlave")
        private JdbcTemplate jdbcTemplate;
    
        public String getHelloMessage() {
            String host = jdbcTemplate.queryForObject("select @@hostname;", String.class);
            System.out.println(host);
            return "Hello";
        }
    
    }
    
  • nanospeck
    nanospeck almost 8 years
    It works great. Can you share the link where this technique is mentioned in the official documentation. Just to know where I should have looked. Tks.
  • Prakash P
    Prakash P over 6 years
    Communicating with two different data sources using JPA is somewhat complicated as shown in https://github.com/spring-projects/spring-data-examples/tree‌​/master/jpa/multiple‌​-datasources . Can we use the above process of creating two different instances of MysqlTemplate to communicated using JPA with tables of different databases?