Spring Boot (>1.1.0)中的多数据源和JdbcTemplate

38

我想在一个Spring Boot项目中注入一个特定的JdbcTemplate。我尝试按照这个示例对多个DataSource进行配置:http://spring.io/blog/2014/05/27/spring-boot-1-1-0-m2-available-now

我的代码可以编译和运行,但是只有带有@Primary注释的DataSource被考虑在内,无论我在SqlService类中用什么作为@Qualifier。 我的相关代码如下:

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

}

3
您真的需要自动装配吗?为什么不直接从您的“slaveJdbcTemplate”bean方法中调用“slaveDataSource()”?这样应该比自动装配稍微快一点。 要让“@Qualifier”起作用,它应该在参数上,您现在正在对bean进行限定而不是注入点。 - M. Deinum
谢谢你的回答,我确实需要将@Qualifier移到参数中。你说的自动装配不是必须的,我可能会回到一个简单的调用。 - Xavier
2个回答

29

它应该看起来像这样:

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

@param 前的 @Qualifier 是关键。即使按名称匹配并且在同一文件中具有新的数据源和 jdbcTemplate,Spring 也会有些困惑。 - Adam

21
尝试将@Qualifier注释移到您的@Bean方法上的parameter,用于JdbcTemplate
我猜,当您删除@Primary时,会出现错误,其中会呈现多个适当的bean

它运行得很好。你能分享一下这个技术在官方文档中提到的链接吗?只是想知道我应该去哪里查找。谢谢。 - nanospeck
使用JPA与两个不同的数据源进行通信有些复杂,如https://github.com/spring-projects/spring-data-examples/tree/master/jpa/multiple-datasources所示。我们能否使用上述创建两个不同MysqlTemplate实例的过程来使用JPA与不同数据库的表进行通信? - Prakash P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接