Spring 批处理框架 - 自动创建批处理 Table

Spring Batch Framework - Auto create Batch Table

我刚刚使用 Spring 批处理框架创建了一个批处理作业,但我没有 运行 创建 SQL 的数据库权限。当我尝试 运行 批处理作业时,我在框架尝试创建 TABLE_BATCH_INSTANCE 时遇到了错误。我尝试禁用

<jdbc:initialize-database data-source="dataSource" enabled="false">    
 ...
</jdbc:initialize-database>

但是我试了之后还是报错

org.springframework.jdbc.BadSqlGrammarException: 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: ORA-00942: table or view does not exist

反正可以禁用SQL,我只是想测试一下我的reader写入器和处理器是否正常工作。

<jdbc:initialize-database/> 标签由 Spring 使用 InitializeDatabaseBeanDefinitionParser 解析。您可以尝试在 IDE 中调试此 class 以确保为 enabled 属性选取了哪些值。也可以使用 JVM 参数 -Dspring.batch.initializer.enabled=false

禁用此值

Spring Batch 使用数据库保存其 recover/retry 功能的元数据。

如果您无法在数据库中创建表,那么 you have to disable this behaviour

如果您可以创建批处理元数据表但不能在运行时创建,那么您可能 create them manually

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/jdbc 
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">


    <!-- database -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/springbatch" />
        <property name="username" value="root" />
        <property name="password" value="" />
    </bean>

    <!-- transaction manager -->
    <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

    <!-- create job-meta tables automatically -->
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" />
        <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" />
    </jdbc:initialize-database>
</beans>

并确保您使用的是 spring-jdbc -版本与 spring-batch。 最有可能 spring-jdbc-3.2.2.RELEASE.JAR 兼容。

使用 Spring Boot 2.0 你可能需要这个: https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch-database

spring.batch.initialize-schema=always

默认情况下,它只会在您使用嵌入式数据库时创建表。

或者

 spring.batch.initialize-schema=never

永久禁用它。

看起来很傻,但有人可能遇到同样的问题。

我在从数据库中删除所有表后收到此错误。当我尝试启动 Spring 批处理时,我收到错误消息:

bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]

和:

Invalid object name 'BATCH_JOB_INSTANCE'

这件事发生在我身上,因为我在没有重新启动服务的情况下删除了表。该服务已启动并接收数据库元数据 和数据库上的 Batch 表 。删除它们而不重新启动服务器后,Spring 批处理认为表仍然存在。

重新启动 Spring 批处理服务器并再次执行批处理后,表创建没有错误。

要启用自动创建 spring 批处理数据模式,只需将此行添加到您的 spring application.properties 文件中即可:

spring.batch.initialize-架构=总是

要了解有关 Spring 批处理元数据架构的更多信息:

https://docs.spring.io/spring-batch/trunk/reference/html/metaDataSchema.html

这对我有用:Spring boot 2.0

  batch:
        initialize-schema: never
        initializer:
            enabled: false

当运行Spring启动时:

Running with Spring Boot v1.5.14.RELEASE, Spring v4.3.18.RELEASE

这应该足够了:

spring:
    batch:
        initializer:
            enabled: false

初始化架构不适用于此 Spring 引导版本。 之后,我能够从 spring-core jar 复制 SQL 脚本并更改 table 大写,因为这是我在 [= 下自动创建 table 的问题20=].

Spring 需要在 table 秒后完成 运行 作业

  • BATCH_JOB_EXECUTION
  • BATCH_JOB_EXECUTION_CONTEXT
  • BATCH_JOB_EXECUTION_PARAMS
  • BATCH_JOB_EXECUTION_SEQ
  • BATCH_JOB_INSTANCE
  • BATCH_JOB_SEQ
  • BATCH_STEP_EXECUTION
  • BATCH_STEP_EXECUTION_CONTEXT
  • BATCH_STEP_EXECUTION_SEQ

如果您使用的是 h2 数据库,那么它将默认创建所有必需的 table

  • spring.h2.console.enabled=真
  • spring.datasource.url=jdbc:h2:mem:testdb
  • spring.datasource.driverClassName=org.h2.Driver
  • spring.datasource.username=sa
  • spring.datasource.password=
  • spring.jpa.database-平台=org.hibernate.dialect.H2方言

当您开始使用 Mysql 或任何其他数据库时,您需要将以下属性添加到 application.properties

               spring.batch.initialize-schema=always

因为Spring Boot 2.5.0 使用

# to always initialize the datasource:
spring.batch.jdbc.initialize-schema=always

# to only initialize an embedded datasource:
spring.batch.jdbc.initialize-schema=embedded

# to never initialize the datasource:
spring.batch.jdbc.initialize-schema=never

spring.batch.initialize-schema 自 2.5.0 起已弃用,在 2.7.0 中删除)

使用以下设置,因为上面建议的设置已被弃用:

spring.batch.jdbc.initialize-schema=总是