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

Posted

技术标签:

【中文标题】Spring Batch / Postgres:错误:关系“batch_job_instance”不存在【英文标题】:Spring Batch / Postgres : ERROR: relation "batch_job_instance" does not exist 【发布时间】:2021-04-14 07:28:18 【问题描述】:

我正在尝试将 Spring Batch 配置为使用 PostGres DB。我在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 容器的日志中都看到以下错误:

春季批次:

<<< 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 ok。

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

在服务器启动期间配置初始数据库缺少什么?

编辑:我尝试明确添加spring.datasource.initialize=true,但没有任何变化。

【问题讨论】:

【参考方案1】:

请检查下面添加在 application.yml 中

spring.batch.initialize-schema: always

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

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

【讨论】:

【参考方案2】:

您需要设置spring.batch.initialize-schema=always 属性来告诉Spring Boot 自动创建Spring Batch 表。有关详细信息,请参阅 Spring Boot 参考文档的Initialize a Spring Batch Database 部分。

【讨论】:

这很有帮助。如果有人仍然感到困惑,请将 spring.batch.initialize-schema=always 添加到 SpringBoot 应用程序的 application.properties 文件中。【参考方案3】:

对于已经设置了spring.batch.initialize-schema=always 但仍无法正常工作的任何人,还要验证您是否使用具有足够权限(包括创建必要的表)的用户连接到数据库。

【讨论】:

【参考方案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'

【讨论】:

以上是关于Spring Batch / Postgres:错误:关系“batch_job_instance”不存在的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch 无法通过 DB (postgres) 获取作业锁

Spring Batch - 无法在 Postgres 上创建元数据表并将实际数据加载到 mysql

Spring Batch/Data JPA 应用程序在调用 JPA 存储库(save、saveAll)方法时不会将数据持久化/保存到 Postgres 数据库

Spring Batch with Spring boot - 配置 JobRepositoryFactoryBean

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

Spring Batch - 创建两个数据源以及如何自定义使用其他属性