【问题标题】:Sequences not working when switching a Spring Batch job repository database to MySQL将 Spring Batch 作业存储库数据库切换到 MySQL 时序列不起作用
【发布时间】:2012-12-28 14:18:02
【问题描述】:

我有一个生产环境中的 Spring Batch 部署,最初是使用 H2 数据源作为作业存储库开发的。最初的努力一切都很好,但是随着我们对 Spring Batch 的使用扩展,我们希望用更传统的数据库替换 H2。无论好坏(这不完全是我的决定),我将改用 MySQL。

我已将作业存储库的数据源从 H2 切换到 MySQL,并将元素更改为使用“classpath:/org/springframework/batch/core/schema-mysql.sql”。当我第一次运行批处理作业时,Spring Batch 会创建存储库表并毫无问题地运行我的作业。

但是,随后的执行失败......即使我正确使用了作业增量器,传递了“-next”参数,并且已经看到它在 H2 上运行良好。当我将日志记录设置为“调试”级别时,我在后续执行中看到以下异常:

org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; 
Duplicate entry '1' for key 'PRIMARY'; 
nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'

我查看了 Spring Batch 用于创建其作业存储库表的“schema-*.sql”脚本。其他数据库类型(例如 H2、Oracle、Postgres 等)创建三个序列...BATCH_STEP_EXECUTION_SEQBATCH_JOB_EXECUTION_SEQBATCH_JOB_SEQ。我不是 MySQL 专家,但看起来 MySQL 缺乏对序列的支持......因为“schema-mysql.sql”包含这些行作为明显的解决方法:

CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
INSERT INTO BATCH_JOB_SEQ values(0);

很明显,MySQL 对序列和自动增量值的处理与其他数据库不同,因此推测 Spring Batch 必须做一些不同的事情来增加其作业存储库表中的 ID。我是否需要采取其他一些我可能不知道的特定于 MySQL 的步骤?提前致谢!

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    问题是我在每次作业运行时都执行classpath:/org/springframework/batch/core/schema-mysql.sql 脚本。

    使用 H2,这很好……只要 jdbc:initialize-database 元素包含 ignore-failures="ALL" 属性,您就不会真正注意到问题。

    但是,MySQL 特定的序列解决方法不是您可以重复执行而不会弄乱 Spring Batch 的东西。

    我从我的 Spring Batch 配置中删除了 jdbc:initialize-database 元素,在一个空数据库中手动执行了一次 classpath:/org/springframework/batch/core/schema-mysql.sql 设置脚本,我的工作运行了多次调用就好了。

    【讨论】:

    • 你知道在春季 4 你会怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2022-12-14
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多