39

我刚刚使用 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,我只是想测试我的读写器和处理器是否正常工作。

4

10 回答 10

54

使用 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

永久禁用它。

于 2017-12-22T22:17:33.317 回答
24

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

如果您无法在数据库中创建表,则必须禁用此行为

如果您可以创建批处理元数据表但不能在运行时创建,那么您可以手动创建它们

于 2015-10-21T09:19:39.440 回答
13

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
于 2020-01-28T18:21:17.087 回答
6

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

spring.batch.initialize-schema=总是

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

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

于 2018-09-17T16:59:21.467 回答
2

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

从数据库中删除所有表后,我收到此错误。当我尝试启动 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 服务器并再次执行批处理后,表的创建没有错误。

于 2018-08-23T13:58:18.667 回答
2

使用 Spring Boot 运行时:

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

这应该足够了:

spring:
    batch:
        initializer:
            enabled: false

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

于 2018-12-21T10:19:06.380 回答
1
<?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兼容。

于 2016-12-08T06:54:21.770 回答
0

这对我有用:Spring Boot 2.0

  batch:
        initialize-schema: never
        initializer:
            enabled: false
于 2018-11-08T11:52:52.493 回答
0

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

于 2015-10-21T06:31:10.697 回答
0

自 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 中删除)

于 2021-09-14T17:44:32.343 回答