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

Spring批处理没有从setTablePrefix获取表前缀

陶健
2023-03-14

我想为spring批处理使用不同的数据源,并创建了下面的配置类,并根据文档将我所需的数据源自动连接到该类。

我使用的是spring boot(2.2.6)和spring batch版本4.2.1。释放

@Configuration
public class CustomBatchConfigurer extends DefaultBatchConfigurer {
    @Autowired
    @Qualifier("oracleDataSource")
    private DataSource dataSource;
    @Autowired
    private PlatformTransactionManager transactionManager;

    @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(transactionManager);
        factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
        factory.setTablePrefix("MYDB.BATCH_");
        factory.setMaxVarCharLength(1000);
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

但当我用它启动应用程序时,它从不应用setTablePrefix,并且总是会失败,出现table not found错误。

我需要使用上面的方法,因为我有两个不同的数据源,我需要spring批处理来使用我的oracleDataSource bean。

如果我禁用非oracleDataSource bean,并将属性移动到应用程序。物业,一切正常。

请指导如何解决这个问题。我在这里看到了一个类似的问题,用户在以不同的模式扩展DefaultBatchConfigurer类Spring批处理表后,抱怨同一个表找不到问题

共有1个答案

燕璞
2023-03-14

调试spring批处理源代码后,我发现在创建jobExplorer时,表前缀被重置。有效的修复方法如下所示。

我认为这应该在Spring批处理留档中提到,因为jobExplorer是常用的,如果没有正确覆盖,可以将表前缀重置回BATCH_,如下所示。

   
@Configuration
public class CustomBatchConfigurer extends DefaultBatchConfigurer {

    @Autowired
    @Qualifier("oracleDataSource")
    private DataSource dataSource;
    @Autowired
    private PlatformTransactionManager transactionManager;
   
   @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(transactionManager);
        factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
        factory.setTablePrefix("MYDB.BATCH_");
        factory.setMaxVarCharLength(1000);
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Override
    protected JobLauncher createJobLauncher() throws Exception {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(createJobRepository());
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    }

    @Override
    protected JobExplorer createJobExplorer() throws Exception {
        JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean();
        jobExplorerFactoryBean.setDataSource(this.dataSource);
        jobExplorerFactoryBean.setTablePrefix("MYDB.BATCH_");
        jobExplorerFactoryBean.afterPropertiesSet();
        return jobExplorerFactoryBean.getObject();
    }
    }


 类似资料:
  • 当我在应用程序属性中添加表前缀时,我遇到了一个问题,Spring Batch没有获取该属性并设置默认前缀Batch。 Spring版 org.springframework.jdbc.错误的SQL语法[SELECTJOB_INSTANCE_ID,JOB_NAMEBATCH_JOB_INSTANCEJOB_NAME=?和JOB_KEY = ?]; 嵌套异常java.sql.SQLSyntaError

  • 在Spring batch中(请参见https://docs.Spring.io/spring-batch/3.0.x/reference/html/metadataschema.html),有六个表: batch_job_execution batch_job_execution_context batch_job_execution_params batch_job_instance batc

  • 如果我的平面文件中有不正确数量的令牌,我会遇到以下异常。 如果我抓住了错误的标记异常我想打印自定义错误日志与文件名,行号和行引起异常。 帮助我。 非常感谢。

  • 我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?

  • 我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。

  • 反正可以禁用SQL,我只是想测试我的读写器和处理器工作正常。