将Spring批处理作业存储库数据库切换到MySQL时序列不起作用

将Spring批处理作业存储库数据库切换到MySQL时序列不起作用,spring,spring-batch,Spring,Spring Batch,我在生产中有一个Spring批处理部署,它最初是使用作业存储库的H2数据源开发的。在最初的努力中,一切都很顺利,但随着Spring批处理的使用范围的扩大,我们希望用更传统的数据库替换H2。不管是好是坏(这不完全是我的决定),我将转而使用MySQL 我已将作业存储库的数据源从H2切换到MySQL,并将元素更改为使用“classpath:/org/springframework/batch/core/schema MySQL.sql”。当我第一次运行批处理作业时,SpringBatch会创建存储库表

我在生产中有一个Spring批处理部署,它最初是使用作业存储库的H2数据源开发的。在最初的努力中,一切都很顺利,但随着Spring批处理的使用范围的扩大,我们希望用更传统的数据库替换H2。不管是好是坏(这不完全是我的决定),我将转而使用MySQL

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

然而,随后的执行失败了。。。尽管我正确地使用了作业递增器,传递了“
-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'
我已经研究了SpringBatch用于创建其作业存储库表的“
schema-*.sql
”脚本。其他数据库类型(如H2、Oracle、Postgres等)创建三个序列<代码>批处理步骤执行顺序,
批处理作业执行顺序
,以及
批处理作业顺序
。我不是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对序列和自动增量值的处理不同于其他数据库,因此SpringBatch可能必须对其作业存储库表中的增量ID做一些不同的事情。我是否需要采取其他一些MySQL特定的步骤,而我可能不知道这些步骤?提前谢谢

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

对于H2,这很好。。。只要
jdbc:initializedatabase
元素包含
ignorefailures=“ALL”
属性,您就不会真正注意到问题

但是,特定于MySQL的序列解决方案并不是可以重复执行而不会导致Spring批处理混乱的


我从Spring批处理配置中删除了
jdbc:initialize database
元素,在空数据库中手动执行了一次
classpath:/org/springframework/Batch/core/schema mysql.sql
设置脚本,我的作业可以运行多次调用。

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

对于H2,这很好。。。只要
jdbc:initializedatabase
元素包含
ignorefailures=“ALL”
属性,您就不会真正注意到问题

但是,特定于MySQL的序列解决方案并不是可以重复执行而不会导致Spring批处理混乱的


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

您知道在spring 4中如何执行此操作吗?您知道在spring 4中如何执行此操作吗?