Spring Batch Framework - 自动创建批处理表

Posted

技术标签:

【中文标题】Spring Batch Framework - 自动创建批处理表【英文标题】:Spring Batch Framework - Auto create Batch Table 【发布时间】:2016-01-19 21:31:52 【问题描述】:

我刚刚使用 Spring Batch 框架创建了一个批处理作业,但我没有运行 CREATE 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,我只是想测试我的读写器和处理器是否正常工作。

【问题讨论】:

【参考方案1】:

使用 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 Boot 2.5.3 并且在测试环境中我的 H2 数据库 + Flyway 出现问题......手动创建 BATCH 表发生了两次......我必须设置初始化-schema 到 never ... 除了键现在似乎已经改变:spring.batch.jdbc.initialize-schema=never 很高兴知道,我试图查明这种变化的时间,但在迁移指南或当前文档的任何地方都找不到对这个新密钥的任何引用。我很好奇你在哪里/如何得知它发生了变化? @丹 嘿@pim-hazebroek ...你知道我想我让 JetBrains 的 IntelliJ 帮助我自动完成。我可能也看过源代码?当我回到我的项目时,我会给你一个明确的答案。【参考方案2】:

Spring Batch 使用数据库为其恢复/重试功能保存元数据。

如果你不能在数据库中创建表,那么you have to disable this behaviour

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

【讨论】:

使用 MapJobRepositoryFactoryBean 和 ResourcelessTransactionManager 禁用 SQL 谢谢 Sergio,只是一个简单的问题,我可以删除/避免创建这些表吗?我只是使用 Spring Batch 从 DB 的表中获取数据 寿司,这就是我列出的第一个选项的作用(“如果你不能在数据库中创建表,那么......”)【参考方案3】:

Spring Batch 需要下表来运行作业

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 db,那么它将默认创建所有需要的表

spring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

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

               spring.batch.initialize-schema=always

【讨论】:

非常感谢!我点击了下一个错误:JdbcSQLSyntaxErrorException:找不到表“BATCH_STEP_EXECUTION_CONTEXT”。我解决了这个问题,我正在使用 h2 db。【参考方案4】:

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

spring.batch.initialize-schema=always

要了解更多关于 Spring 批处理元数据模式的信息:

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

【讨论】:

我试图使用 postgreSQL 来维护批处理模式。这对我有用。谢谢。!!!【参考方案5】:

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

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

错误的 SQL 语法 [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ?和 JOB_KEY = ?]

和:

无效的对象名称“BATCH_JOB_INSTANCE”

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

重启 Spring Batch 服务器并再次执行批处理后,表创建成功。

【讨论】:

【参考方案6】:

使用 Spring Boot 运行时:

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

这就够了:

spring:
    batch:
        initializer:
            enabled: false

initialize-schema 不适用于此 Spring 引导版本。 之后,我能够从 spring-core jar 复制 SQL 脚本并更改表的大小写,因为这是我在 Windows/Mac/Linux 下自动创建表的问题。

【讨论】:

【参考方案7】:
<?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 -version 与 spring-batch。 很可能 spring-jdbc-3.2.2.RELEASE.JAR 兼容。

【讨论】:

【参考方案8】:

&lt;jdbc:initialize-database/&gt; 标签由 Spring 使用 InitializeDatabaseBeanDefinitionParser 解析。您可以尝试在 IDE 中调试此类,以确保为 enabled 属性选择了哪些值。也可以通过使用JVM参数-Dspring.batch.initializer.enabled=false禁用这个值

【讨论】:

对于 CREATE SQL 它没有显示错误,所以我认为它已被禁用。只是当我重新运行批处理作业时,它再次提示我 SQL 错误,但这一次与 SELECT SQL 有关。 尝试使用您用于 Spring Batch 数据源配置的凭据从数据库客户端运行“SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = xxx and JOB_KEY =xxx”,看看是否有任何访问问题。 【参考方案9】:

这对我有用:Spring boot 2.0

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

【讨论】:

【参考方案10】:

自 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 Framework - 自动创建批处理表的主要内容,如果未能解决你的问题,请参考以下文章

spring batch(二):核心部分:配置Spring batch

在 Spring-boot 上将 Spring Batch 与 spring-batch-admin-manager 集成时出错

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

spring batch ftp 集成超时错误 - 使用 spring-boot/spring-batch 进行 ETL

陪你解读Spring Batch带你入手Spring Batch

Spring boot spring.batch.job.enabled=false 无法识别