当前位置: 首页 > 知识库问答 >
问题:

Spring批处理:批处理的数据源和步骤的数据源

金烨华
2023-03-14

我需要访问两个数据源:

  • Spring批处理存储库:在内存H2中
  • 我的步骤需要访问mssql

我在那里看到了几个关于如何创建自定义批配置器的示例。

然而,有时:

  1. 实现BatchConfigrer
  2. 扩展默认批处理配置

目前,我的配置文件是:

.
├── steps
│   └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java

我的步骤配置是:

@Configuration
public class MssqlBatchConfigurationStep {

    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     *
     * @return
     */
    public ItemReader<Unitat> reader() {
        String sql = "SELECT operation,update_time,table_name,rowid,user_login,user_name, user_ip,application_name,application_version,new_value,old_value FROM renovastorage.data_log";

        JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
        jdbcCursorItemReader.setDataSource(this.dataSource);
        jdbcCursorItemReader.setSql(sql);
        jdbcCursorItemReader.setVerifyCursorPosition(false);
        jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());

        return jdbcCursorItemReader;
    }

    /**
     *
     * @return
     */
    public ItemWriter<UnitatDenormalized> writer() {
        // write to solr
        return null;
    }

}

这里的问题是,这一步是获取默认数据源。此数据源与Spring Batch获取的数据源相同。

为了解决这个问题,我想创建一个“批配置器”,以获取特定的数据源,而不是默认的数据源。

在这里您可以看到我的作业配置:

@Configuration
@EnableBatchProcessing
// @EnableScheduling
public class MainJobBatchConfiguration {

    private JobBuilderFactory jobBuilderFactory;
    private StepBuilderFactory stepBuilderFactory;

    private MssqlBatchConfigurationStep unitatBatchStep;

    /**
     *
     * @param jobBuilderFactory
     * @param stepBuilderFactory
     */
    public MainJobBatchConfiguration(
        JobBuilderFactory jobBuilderFactory,
        StepBuilderFactory stepBuilderFactory,
        MssqlBatchConfigurationStep unitatBatchStep
    ) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
        this.unitatBatchStep = unitatBatchStep;
    }


    /**
     *
     * @return
     */
    @Bean
    public Step step() {
        return this.stepBuilderFactory
            .get("mssql")
            .<Unitat, UnitatDenormalized>chunk(10)
            .reader(this.unitatBatchStep.reader())
            .writer(this.unitatBatchStep.writer())
            .build();
    }

    /**
     *
     * @param step
     * @return
     */
    @Bean
    public Job job(Step step) {
        Job job = this.jobBuilderFactory.get("job1")
            .flow(step)
            .end()
            .build();
        return job;
    }

}

共有2个答案

吕岳
2023-03-14

我的step需要访问mssql。

为了解决这个问题,我想创建一个“批处理配置器”以获取特定的数据源而不是默认数据源。

为了解决这个问题,我将在数据源上添加一个限定符,以指定在步骤中应该使用哪个限定符:

@Configuration
public class MssqlBatchConfigurationStep {

   private DataSource dataSource;

   /**
    *
    * @param dataSource
   */
   public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
      this.dataSource = dataSource;
   }

}

这样,读者应该指向mssql数据源并从中读取数据。

燕雨石
2023-03-14

您需要添加一个辅助数据源bean并自动连接该数据源。

应用属性

spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]

数据源配置

    @Primary
    @Bean(value = "defaultDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource datasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

    @Bean(value = "secondDataSource")
    @ConfigurationProperties(prefix = "spring.second-datasource")
    public DataSource ticketDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

在你的阅读器中自动连接第二个数据源。

    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
        this.dataSource = dataSource;
    }
 类似资料:
  • 我试图在spring boot项目中配置spring批处理,我想在没有数据源的情况下使用它。我发现是一条可行之路,但我无法让它发挥作用。问题是我已经定义了另外3个数据源,但我不想在springBatch中使用其中任何一个。 我已经检查了默认实现,如果找不到数据源,它将完全按照我的要求执行。问题是我有三个,不想用任何一个。 请不要建议使用hsql或其他内存DB,因为我不想这样。

  • 我正在编写Spring批的Spring Boot应用程序,其中ItemReader从Oracle数据库读取数据并将数据写入postgres sql,但我得到了以下错误 我不想创建spring批处理元数据表,我的应用程序不需要监视作业,请就此向我提出建议。提前谢谢!!

  • 我的数据库中有大约1000万个blob格式的文件,我需要转换并以pdf格式保存它们。每个文件大小约为0.5-10mb,组合文件大小约为20 TB。我正在尝试使用spring批处理实现该功能。然而,我的问题是,当我运行批处理时,服务器内存是否可以容纳那么多的数据?我正在尝试使用基于块的处理和线程池任务执行器。请建议运行作业的最佳方法是否可以在更短的时间内处理如此多的数据

  • 我有一个Spring Boot(面向批处理)应用程序,它使用一个数据源来完成批处理作业,并将内容写入数据库。 我在类似: 问题是,当我尝试将数据源注入一个Spring配置文件时: ...它告诉我: 无法自动连线。存在多个“DataSource”类型的bean。 Beans:数据源 我还尝试注入数据源,例如: ...但是没有运气:(,尽管这两个数据源的问题最终消失了。 有什么线索可以“绕过”吗?

  • 我有一个Spring批处理作业。它的阅读器通过一些复杂的sql从数据库中读取一些记录。现在,对于我从数据库收到的每一条记录,我必须再打一个表来获取一些属性。注意:-我不能在阅读器步骤中加入这个表sql。所以这些获取的属性以及现有记录中的数据需要写入文件。这可以用Spring批处理完成吗?

  • 我试图在Spring批处理中配置几个数据源。启动时,Spring批处理抛出以下异常: 批处理配置的代码段 不知道为什么我会看到这个异常,因为我看到了一些基于xml的Spring批处理配置,这些配置声明了多个数据源。我使用的是Spring批处理核心版本3.0.1.发行版和Spring Boot版本1.1.5.发行版。如有任何帮助,将不胜感激。