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=总是
我刚刚使用 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=总是