在Spring Boot中配置两个DataSource

时间:2017-05-25 12:40:22

标签: spring-boot spring-jdbc

在我的Spring Boot应用程序中配置两个DataSource时,我遇到了最奇怪的情况:只有一个正常工作:

@Configuration
(...)
    @Bean(destroyMethod = "close")
    protected DataSource applicationDataSource(
        (...)
        return dataSource;
    }

并且有两个:

@Configuration
(...)
    @Bean(destroyMethod = "close")
    @Primary
    protected DataSource applicationDataSource(
        (...)
        return dataSource;
    }

@Configuration
(...)
    @Bean
    protected DataSource localDataSource(
        (...)
        return dataSource;
    }

(它们位于不同的配置文件中)

现在奇怪的是,有两个DS没有相关的特定错误。我得到的错误是一个看似无关的错误,说它找不到Injected bean实例(在与DataSources无关的完全不同的配置文件中)。我注意到当只使用一个DS时,DS bean在错误中显示的bean之前被实例化了,这让我觉得在定义两个DS时它们只是被忽略了。

我尝试了很多东西,包括将第二个bean声明为另一种类型的DS

@Configuration
(...)
    @Bean
    protected HikariDataSource localDataSource(
        (...)
        return dataSource;
    }

但没有任何效果。

现在,对于最奇怪的事情,我通过将第二个bean声明为对象(!!!)来发现一个有效的黑客

@Configuration
(...)
    @Bean
    protected Object localDataSource(
        (...)
        return dataSource;
    }

这个有效!!!我只需将其转换到别处(例如,实现SqlSessionFactoryBean或DataSourceTransactionManager)。

请注意,这些方法受到保护,但我也是公开测试的。至于Spring Boot应用程序,我测试了是否有排除

@Configuration
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})

所以我得到了它的工作,一切都很好,但我无法弄清楚这是怎么发生的,我真的很想让它在没有黑客的情况下工作......

干杯。

1 个答案:

答案 0 :(得分:0)

我怀疑你有一个自动装配问题,因为配置了两个类型为DataSource的bean,可能有一个标有@Primary的多个

打开org.springframework的日志记录应突出显示。发布启动日志。

您的修复工作正常,因为您实际上只创建了一个DataSource类型的bean,因此自动装配问题得到解决。