首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Spring Batch中使用多个DataSources

在Spring Batch中使用多个DataSources
EN

Stack Overflow用户
提问于 2014-08-28 12:00:49
回答 5查看 44.2K关注 0票数 43

我正在尝试在Spring Batch中配置几个数据源。在启动时,Spring Batch抛出以下异常:

To use the default BatchConfigurer the context must contain no more thanone DataSource, found 2

来自批处理配置的代码片段

代码语言:javascript
复制
@Configuration
@EnableBatchProcessing 
public class BatchJobConfiguration {

    @Primary
    @Bean(name = "baseDatasource")
    public DataSource dataSource() {
         // first datasource definition here
    }
    @Bean(name = "secondaryDataSource")
    public DataSource dataSource2() {
         // second datasource definition here
    }
    ...
}

我不确定为什么会出现这种异常,因为我看到了一些基于xml的Spring batch配置,这些配置声明了多个数据源。我正在使用Spring Batch核心版本3.0.1.RELEASE和Spring Boot版本1.1.5.RELEASE。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-03-20 19:15:03

AbstractBatchConfiguration首先尝试在容器中查找BatchConfigurer,如果没有找到,则尝试自己创建它-这是在容器中有多个DataSource bean的情况下抛出IllegalStateException的地方。

解决这个问题的方法是防止在AbstractBatchConfiguration中创建DefaultBatchConfigurer bean。为此,我们建议使用@Component注释通过Spring容器创建DefaultBatchConfigurer

我们可以用@ComponentScan注释放置@EnableBatchProcessing的配置类,它扫描包含从DefaultBatchConfigurer派生的空类的包

代码语言:javascript
复制
package batch_config;
...
@EnableBatchProcessing
@ComponentScan(basePackageClasses = MyBatchConfigurer.class)
public class MyBatchConfig {
    ...
}

这个空的派生类的完整代码如下:

代码语言:javascript
复制
package batch_config.components;
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.stereotype.Component;
@Component
public class MyBatchConfigurer extends DefaultBatchConfigurer {
}

在此配置中,@Primary注释适用于DataSource bean,如以下示例所示:

代码语言:javascript
复制
@Configuration
public class BatchTestDatabaseConfig {
    @Bean
    @Primary
    public DataSource dataSource()
    {
        return .........;
    }
}

这适用于Spring Batch版本3.0.3.RELEASE

DataSource上的@Primary批注工作的最简单的解决方案可能是只添加@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)@EnableBatchProcessing批注:

代码语言:javascript
复制
@Configuration
@EnableBatchProcessing
@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
public class MyBatchConfig {
票数 25
EN

Stack Overflow用户

发布于 2015-05-20 17:44:02

您必须提供自己的BatchConfigurer。Spring不想为你做这样的决定

代码语言:javascript
复制
@Configuration
@EnableBatchProcessing
public class BatchConfig {

     @Bean
      BatchConfigurer configurer(@Qualifier("batchDataSource") DataSource dataSource){
        return new DefaultBatchConfigurer(dataSource);
      }

...
票数 30
EN

Stack Overflow用户

发布于 2018-07-31 05:51:22

最简单的解决方案是扩展DefaultBatchConfigurer并通过限定符自动连接您的数据源:

代码语言:javascript
复制
@Component
public class MyBatchConfigurer extends DefaultBatchConfigurer {

    /**
     * Initialize the BatchConfigurer to use the datasource of your choosing
     * @param firstDataSource
     */
    @Autowired
    public MyBatchConfigurer(@Qualifier("firstDataSource") DataSource firstDataSource) {
        super(firstDataSource);
    }
}

附注(因为这也涉及到多个数据源的使用):如果您使用autoconfig来运行数据初始化脚本,您可能会注意到它不是在您期望的数据源上进行初始化。对于这个问题,看一下这个:https://github.com/spring-projects/spring-boot/issues/9528

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25540502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档