Spring Batch 不使用自定义数据源创建表

Posted

技术标签:

【中文标题】Spring Batch 不使用自定义数据源创建表【英文标题】:Spring Batch doesn't use custom datasource to create tables 【发布时间】:2017-09-25 02:19:54 【问题描述】:

我正在开发 REST 服务(使用 Spring 启动),它运行批处理作业。我希望批处理只与 嵌入式数据源(用于存储元数据),而默认数据源(在我的例子中为 Postgres)将用于存储业务实体。

问题是 Batch 在启动时尝试在默认数据源中创建元数据表(如 batch_job_executionbatch_job_instance 等)。

这是重现问题的示例配置:

批量配置

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer 

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) 
        super.setDataSource(dataSource);
    

数据源配置

@Configuration
public class DataSourceConfiguration 
    @Bean
    @Primary
    public DataSource DataSource() 
        final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(org.postgresql.Driver.class);
        dataSource.setUrl("jdbc:postgresql://localhost:5432/test_batch");
        dataSource.setUsername("user");
        dataSource.setPassword("password");

        return dataSource;
    

    @Bean(name = "batchDataSource")
    public DataSource batchDataSource() 
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    

使用此配置,我在微服务启动时在 Postgres 中获取批处理表,但之后似乎使用了嵌入式数据源,因为我在尝试时遇到 H2 的 "Table not found" 错误开始工作。

那么我应该如何正确编写配置以使 Batch 仅适用于嵌入式数据源?我不希望主数据源中有任何元数据(甚至是空表)。

更新:

正如 Michael Minella 所说,应该再添加一个 bean:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer 

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) 
        super.setDataSource(dataSource);
    

    @Bean
    public BatchDatabaseInitializer   batchDatabaseInitializer(@Qualifier("batchDataSource") DataSource dataSource, ResourceLoader resourceLoader)
        BatchDatabaseInitializer batchDatabaseInitializer = new     BatchDatabaseInitializer(dataSource, resourceLoader, new BatchProperties());
        return batchDatabaseInitializer;
    

【问题讨论】:

您必须配置两个不同的数据源。在从您的属性/yml 中读取以“spring.datasource”为前缀的数据资源信息后,Spring Boot 将自动为您配置一个。此数据源将用于存储 Spring Batch 元表。您必须自己创建的第二个数据源可用作您的默认数据源 为什么你认为'spring.datasource'属性只会影响与批处理相关的数据源?你能举个例子吗? 【参考方案1】:

不幸的是,使用 Spring Boot 时,BatchDataSourceInitializer 使用的 DataSourceBatchConfigurer 无关。它只是在上下文中获取默认的DataSource。如果您自己配置BatchDataSourceInitializer,则Boot 不会启动,您可以定义直接使用哪个DataSource

【讨论】:

顺便说一句,您能否解释一下为什么让配置扩展DefaultBatchConfigurer 类很重要?我尝试将配置器作为常规 bean,但在这种情况下它没有被使用。 它不需要扩展DefaultBatchConfigurer,但如果你不需要,你需要完成BatchConfigurer接口的实现,这可能是不必要的工作。 @MichaelMinella 如果我没有任何主数据源怎么办。就我而言,我得到了 3 个数据源,处理器和编写器访问了所有 3 个数据源。您有时间可以查看***.com/questions/67651106/…

以上是关于Spring Batch 不使用自定义数据源创建表的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Batch 应用程序中自定义步骤的参数

Spring Batch Framework - 自动创建批处理表

用于动态块大小的 Spring Batch 自定义完成策略

为 Spring Batch 应用程序初始化 H2 数据库

Spring Batch - 如何在不同的模式上创建元数据表?

spring boot(spring batch)配置禁用自动创建数据库