Несколько источников данных и JdbcTemplate в Spring Boot (› 1.1.0)

Я хотел бы внедрить конкретный JdbcTemplateв проект Spring Boot. Я попытался следовать этому примеру для нескольких DataSourceconfiguration: http://spring.io/blog/2014/05/27/spring-boot-1-1-0-m2-available-now

Мой код компилируется и запускается, но учитывается только источник данных с аннотацией @Primary, независимо от того, что я указал как @Qualifier в классе SqlService. Мой соответствующий код следующий:

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);
    }

}

И я сделал быстрый сервис, чтобы попробовать это:

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";
    }

}

person Xavier    schedule 15.07.2014    source источник
comment
Вам действительно нужна автопроводка? Почему бы просто не вызвать slaveDataSource() из метода компонента slaveJdbcTemplate? Должно быть немного быстрее, чем autowired. Чтобы @Qualifier работал, он должен быть в параметре, теперь вы квалифицируете свой компонент, а не точку инъекции.   -  person M. Deinum    schedule 15.07.2014
comment
Спасибо за ваш ответ, мне действительно нужно было переместить @Qualifier в параметр. Вы правы в том, что автопроводка не нужна, я мог бы вернуться к простому звонку   -  person Xavier    schedule 15.07.2014


Ответы (2)


Попробуйте переместить аннотацию @Qualifier в parameter ваших @Bean методов для JdbcTemplate.

Я думаю, когда вы удаляете @Primary, вы получаете ошибку, где more than one appropriate beans are presented

person Artem Bilan    schedule 15.07.2014
comment
Это прекрасно работает. Можете ли вы поделиться ссылкой, где этот метод упоминается в официальной документации. Просто чтобы знать, где я должен был искать. спасибо - person nanospeck; 17.06.2016
comment
Связь с двумя разными источниками данных с использованием JPA несколько сложна, как показано на https://github.com/spring-projects/spring-data-examples/tree/master/jpa/multiple-datasources. Можем ли мы использовать описанный выше процесс создания двух разных экземпляров MysqlTemplate для связи с использованием JPA с таблицами разных баз данных? - person Prakash Pandey; 16.10.2017

Это должно выглядеть так:

@Bean(name = "jdbcSlave")
@Autowired
public JdbcTemplate slaveJdbcTemplate(@Qualifier("dsSlave") DataSource dsSlave) {
    return new JdbcTemplate(dsSlave);
}
person KirkoR    schedule 15.07.2014