PreparedStatementCallback;错误的SQL语法[从BATCH_JOB_INSTANCE中选择SELECT JOB_INSTANCE_ID,JOB_NAME,其中JOB_NAME =吗?和JOB_KEY =?

时间:2019-03-27 15:55:56

标签: spring spring-batch

我希望在MYSQL服务器上创建 Spring Batch元数据,并使用Oracle的所有现有表从中获取数据并将其放入mongoDB中。

我创建了以下配置,但是通过配置以某种方式缺少创建spring batch元数据表的技巧。

有人可以指导我吗?

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=MY_DB

#By default, Spring runs all the job as soon as it has started its context.
spring.batch.job.enabled=false

spring.batch.initialize-schema=always
spring.batch.tablePrefix=test.BATCH_
#spring.batch.initializer.enabled=false
spring.batch.schema=org/springframework/batch/core/schema-mysql.sql

spring.datasource.url=jdbc:oracle:thin:@localhost:1527:OR_DEV
spring.datasource.username=EDR_USR
spring.datasource.password=txz$2Zhr
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

jdbc.batch.jdbcUrl=jdbc:mysql://localhost:3306/test?useSSL=false
jdbc.batch.username=root
jdbc.batch.password=root
jdbc.batch.driver-class-name=com.mysql.cj.jdbc.Driver

DBConfig.java

@Configuration
@ComponentScan
public class DBConfig {

    @Autowired
    private Environment env;

    @Bean(name="oracleDS")
    public DataSource batchDataSource(){          
           return DataSourceBuilder.create()
                    .url(env.getProperty("spring.datasource.url"))
                    .driverClassName(env.getProperty("spring.datasource.driver-class-name"))
                    .username(env.getProperty("spring.datasource.username"))
                    .password(env.getProperty("spring.datasource.password"))
                    .build();          
    } 

    @Bean(name="mysqlDS")
    @Primary
    public DataSource mysqlBatchDataSource(){          
           return DataSourceBuilder.create()
                    .url(env.getProperty("jdbc.batch.jdbcUrl"))
                    .driverClassName(env.getProperty("jdbc.batch.driver-class-name"))
                    .username(env.getProperty("jdbc.batch.username"))
                    .password(env.getProperty("jdbc.batch.password"))
                    .build();          
    }
}

工作

@GetMapping("/save-student")
    public String saveStudent() {
        JobParameters params = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis()))
                .addString("Job_ID", String.valueOf(System.currentTimeMillis()))
                .addDate("date", new Date())
                .toJobParameters();
        try {
            JobExecution jobExecution = jobLauncher.run(countryJob, params);
            log.debug("Job Status : " + jobExecution.getStatus());
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                | JobParametersInvalidException e) {
            log.error("Job Failed : "+e.getMessage());
        }
        return "";
    }

错误:

{
    "timestamp": "2019-03-27T14:57:52.745+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQLSyntaxErrorException: Table 'test.batch_job_instance' doesn't exist",
    "path": "/save-student"
}

2 个答案:

答案 0 :(得分:0)

为解决此问题,我通过从以下位置执行脚本来手动执行MYSQL spring批处理元数据表:MySQL Spring Batch Metadata tables script

由于我们有两个数据源,Spring Batch无法自动创建元数据表,因此将出现此错误。我作为解决方法手动执行了脚本,但是有什么方法可以通过代码解决此问题?

答案 1 :(得分:0)

在 application.properites 文件中写入以下代码。它将自动生成春季批次所需的表。

spring.batch.initialize-schema=always