Spring Batch 在 H2 的 SQL 语句中创建语法错误
Posted
技术标签:
【中文标题】Spring Batch 在 H2 的 SQL 语句中创建语法错误【英文标题】:Spring Batch creates syntax errors in SQL statements for H2 【发布时间】:2021-12-28 08:06:37 【问题描述】:我将 Spring Boot & Batch 从 1.5.9 升级到 Spring Boot & Batch 2.5.6。 现在我遇到了 Spring Batch 模式初始化的问题。 我在 JUnit5 测试类中运行 H2。 第一次尝试是通过 Spring Batch 初始化:
spring:
batch:
jdbc:
initialize-schema: "always"
它创建序列但不创建任何表。 查看跟踪它在创建表 SQL 中显示语法错误: SQL 语句中的语法错误(一个示例):
CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT IDENTITY[*] NOT NULL PRIMARY KEY , VERSION BIGINT , JOB_NAME VARCHAR(100) NOT NULL, JOB_KEY VARCHAR(32) NOT NULL, CONSTRAINT JOB_INST_UN UNIQUE (JOB_NAME, JOB_KEY) )
确实,检查 qith H2 控制台或 SQl linter 会将“IDENTITY[*]”标记为错误,否则它将在 H2 中工作。
第二次尝试解决方法也失败了。 我放了
spring:
batch:
jdbc:
initialize-schema: "never"
并按照 Spring 文档放置所有 SQL https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#exampleDDLScripts 进入 schema.sql。 并且所有表格和序列均已正确创建。 但是,Spring Boot 启动失败并出现错误:
Could not obtain sequence value; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Field "BATCH_JOB_SEQ.NEXTVAL" not found
Column "BATCH_JOB_SEQ.NEXTVAL" not found; SQL statement:
select BATCH_JOB_SEQ.nextval from dual [42122-204]
当然,序列没有列“nextval”,因为它是一个序列。 甚至 Spring Batch 中不支持序列的数据库的解决方法序列表也没有该列。
数据库已正确配置为 H2 数据库(没有尝试其他数据库)。
为什么 Spring Batch 每次都会创建错误的 SQL 语句? 谁能指出正确的方向?
【问题讨论】:
见github.com/spring-projects/spring-batch/issues/4045 【参考方案1】:解决方案是 H2 版本。 我们还将 H2 升级到 2.0,但该版本与 Spring Batch 4.3.4 不兼容。 降级到 H2 版本 1.4.200 解决了这个问题。
【讨论】:
【参考方案2】:MODE=LEGACY
将使用 Spring boot 2.6.x 解决 H2 2.x 上的问题。
(nextval
支持将重新启用)
查看详情:https://github.com/spring-projects/spring-boot/issues/29034#issuecomment-1002641782
【讨论】:
根据基础设施,另一种模式可以提供帮助。我们已经有MODE=PostgreSQL
用于其他初始化脚本。然后我们需要属性spring.batch.jdbc.platform: postgresql
并确保问题4045 已解决(spring-core 5.3.15 或 4.3.5 或 spring-boot 2.5.9 或...)以上是关于Spring Batch 在 H2 的 SQL 语句中创建语法错误的主要内容,如果未能解决你的问题,请参考以下文章
从内存数据库中的 H2 切换到 SQL Server 时出错
如何在 Spring Boot 2 中为 Spring Batch 配置数据源以进行测试
带有 JobParameters 的 Spring Batch SQL 命令