Spring Batch / Postgres:错误:关系“batch_job_instance”不存在。

13

我正在尝试配置Spring Batch以使用PostGres数据库。我已在我的build.gradle.kts文件中包含了以下依赖项:

implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.postgresql:postgresql")

我的SpringBatch模块的application.yml文件包含以下内容:

spring:
  datasource:
    url: jdbc:postgresql://postgres:5432/springbatchdb
    username: postgres
    password: root
    driverClassName: org.postgresql.Driver

docker-compose.yml

postgres:
    restart: always
    image: postgres:12-alpine
    container_name: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=springbatchdb
    ports:
     - "5432:5432"
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

然而,当我尝试添加数据文件时,我在我的SpringBatch Docker容器和PostGres容器的日志中看到以下错误:

Spring Batch:

<<< Exception in method: org.meanwhileinhell.spring.batch.server.SpringBatchController.handle 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 org.postgresql.util.PSQLException: ERROR: relation "batch_job_instance" does not exist

PostGres:

LOG:  database system is ready to accept connections
2021-01-08 09:54:56.778 UTC [56] ERROR:  relation "batch_job_instance" does not exist at character 39
2021-01-08 09:54:56.778 UTC [56] STATEMENT:  SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = $1 and JOB_KEY = $2
2021-01-08 09:55:27.033 UTC [56] ERROR:  relation "batch_job_instance" does not exist at character 39
2021-01-08 09:55:27.033 UTC [56] STATEMENT:  SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = $1 and JOB_KEY = $2

我可以看到SB服务器正从我的元数据中成功获取POSTGRES。

JobRepositoryFactoryBean     : No database type set, using meta data indicating: POSTGRES

我在启动服务器时,需要配置初始数据库,但是我错过了什么?

编辑:我已经尝试过显式添加 spring.datasource.initialize=true,但没有任何变化。

7个回答

17
请检查在application.yml文件中下面添加的内容。
spring.batch.initialize-schema: always

请检查下面的依赖项是否已添加

<artifactId>spring-boot-starter-batch</artifactId>

5
在较新的版本中,配置现在位于jdbc下 - spring.batch.jdbc.initialize-schema=always。https://docs.spring.io/spring-boot/docs/2.7.x/reference/htmlsingle/#howto.data-initialization.batch - Sašo5
3
我将我的Spring Boot升级到3之后,初始化不再起作用了。无论它是否设置为始终如此都没有关系。 - Mehdi
1
@Mehdi 你已经弄清楚原因了吗? - anhvutnu

16

在Spring 5.0中对我起作用的解决方案!

我花了很多时间解决问题,比如在使用最新的Spring Boot Starter 3.0和Spring Batch 5.0时出现错误:关系"X"不存在

spring.batch.jdbc.initialize-schema=always

然而,它没有为我创建必要的表格。虽然根据文档,它应该创建表格。
经过大量的研究,我发现在最新的Spring Batch 5.0中有很多改进。而且当我迁移到新的Spring 5时,我做了很多错误的事情。
从你的配置中删除`@EnableBatchProcessing`。因为在最新的Spring Batch 5中,你不再需要它了。
例如:
```java @Configuration @AllArgsConstructor @EnableBatchProcessing //请删除它 public class SpringBatchConfiguration {} ```
将其改为:
```java @Configuration @AllArgsConstructor public class SpringBatchConfiguration {} ```
第二件我做错的事情是使用了错误的事务管理器。如果你正在使用JPA来持久化实体,你需要相应的事务管理器。
我使用的`ResourcelessTransactionManager()`在我的情况下是错误的,并且在运行时引发了很多问题。
对于JPA,你需要一个`JpaTransactionManager()`。
类似这样:
```java @Bean public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(); } ```
第三件我从错误中学到的事情是,除非我们做一些复杂的事情,比如有两个`Datasource`,一个用于写入Spring Batch相关的表,另一个用于持久化我们的业务数据,否则我们不需要创建`Datasource`的bean。
在需要使用`JobRepository`的任何地方,只需注入它。
类似这样:
```java @Bean @Autowired Job job(JobRepository jobRepository) { JobBuilder jobBuilderFactory = new JobBuilder("somename", jobRepository ); return jobBuilderFactory.flow(step1(jobRepository)).end() .build(); } ```
有关迁移的更多详细信息,请参阅:Spring Migration 3指南。

对我来说,它也适用于Spring Batch 5。 - undefined
谢谢,这对我有用。不知道为什么Spring Batch文档没有提供完整的配置信息。 - undefined

4

YAML文件是什么?

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=1234
spring.datasource.driver-class-name=org.postgresql.Driver
spring.batch.jdbc.initialize-schema=always

Gradle 依赖项

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.projectlombok:lombok-maven-plugin:1.18.6.0'
    implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.batch:spring-batch-test'
}

3

在 application.properties 文件中,

在 Spring Boot 2.5 之前,我们可以使用

spring.batch.initialize-schema=ALWAYS

Spring Boot 2.5 的后续版本使用以下内容

spring.batch.jdbc.initialize-schema=ALWAYS

3
你需要设置 spring.batch.initialize-schema=always 属性,告诉Spring Boot自动创建Spring Batch表。有关详细信息,请参阅Spring Boot参考文档中的初始化Spring Batch数据库部分。

3
这非常有帮助。如果还有人感到困惑,请在您的SpringBoot应用程序的application.properties文件中添加spring.batch.initialize-schema=always - need_to_know_now

3

如果您已经设置了spring.batch.initialize-schema=always,但仍然无法正常工作,请确保您使用具有足够权限的用户连接到数据库,包括创建必要的表。


0

我使用了spring.batch.jdbc.initialize-schema=always参数。我还连接了一个有创建表权限的用户。但是,Spring Batch元数据表仍然无法被创建。

我的解决方案是手动创建这些表。可以在这里找到DDL。您需要选择适用于特定数据库服务器的DDL。以下是我们使用的Oracle版本。

CREATE TABLE BATCH_JOB_INSTANCE  (
    JOB_INSTANCE_ID NUMBER(19,0)  NOT NULL PRIMARY KEY ,
    VERSION NUMBER(19,0) ,
    JOB_NAME VARCHAR2(100 char) NOT NULL,
    JOB_KEY VARCHAR2(32 char) NOT NULL,
    constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) SEGMENT CREATION IMMEDIATE;

CREATE TABLE BATCH_JOB_EXECUTION  (
    JOB_EXECUTION_ID NUMBER(19,0)  NOT NULL PRIMARY KEY ,
    VERSION NUMBER(19,0)  ,
    JOB_INSTANCE_ID NUMBER(19,0) NOT NULL,
    CREATE_TIME TIMESTAMP(9) NOT NULL,
    START_TIME TIMESTAMP(9) DEFAULT NULL ,
    END_TIME TIMESTAMP(9) DEFAULT NULL ,
    STATUS VARCHAR2(10 char) ,
    EXIT_CODE VARCHAR2(2500 char) ,
    EXIT_MESSAGE VARCHAR2(2500 char) ,
    LAST_UPDATED TIMESTAMP(9),
    constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
    references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) SEGMENT CREATION IMMEDIATE;

CREATE TABLE BATCH_JOB_EXECUTION_PARAMS  (
    JOB_EXECUTION_ID NUMBER(19,0) NOT NULL ,
    PARAMETER_NAME VARCHAR(100 char) NOT NULL ,
    PARAMETER_TYPE VARCHAR(100 char) NOT NULL ,
    PARAMETER_VALUE VARCHAR(2500 char) ,
    IDENTIFYING CHAR(1) NOT NULL ,
    constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) SEGMENT CREATION IMMEDIATE;

CREATE TABLE BATCH_STEP_EXECUTION  (
    STEP_EXECUTION_ID NUMBER(19,0)  NOT NULL PRIMARY KEY ,
    VERSION NUMBER(19,0) NOT NULL,
    STEP_NAME VARCHAR2(100 char) NOT NULL,
    JOB_EXECUTION_ID NUMBER(19,0) NOT NULL,
    CREATE_TIME TIMESTAMP(9) NOT NULL,
    START_TIME TIMESTAMP(9) DEFAULT NULL ,
    END_TIME TIMESTAMP(9) DEFAULT NULL ,
    STATUS VARCHAR2(10 char) ,
    COMMIT_COUNT NUMBER(19,0) ,
    READ_COUNT NUMBER(19,0) ,
    FILTER_COUNT NUMBER(19,0) ,
    WRITE_COUNT NUMBER(19,0) ,
    READ_SKIP_COUNT NUMBER(19,0) ,
    WRITE_SKIP_COUNT NUMBER(19,0) ,
    PROCESS_SKIP_COUNT NUMBER(19,0) ,
    ROLLBACK_COUNT NUMBER(19,0) ,
    EXIT_CODE VARCHAR2(2500 char) ,
    EXIT_MESSAGE VARCHAR2(2500 char) ,
    LAST_UPDATED TIMESTAMP(9),
    constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) SEGMENT CREATION IMMEDIATE;

CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT  (
    STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY,
    SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL,
    SERIALIZED_CONTEXT CLOB ,
    constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
    references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) SEGMENT CREATION IMMEDIATE;

CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT  (
    JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY,
    SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL,
    SERIALIZED_CONTEXT CLOB ,
    constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
    references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) SEGMENT CREATION IMMEDIATE;

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接