将Spring批处理作业存储库数据库切换到MySQL时序列不起作用
我在生产中有一个Spring批处理部署,它最初是使用作业存储库的H2数据源开发的。在最初的努力中,一切都很顺利,但随着Spring批处理的使用范围的扩大,我们希望用更传统的数据库替换H2。不管是好是坏(这不完全是我的决定),我将转而使用MySQL 我已将作业存储库的数据源从H2切换到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会创建存储库表
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中如何执行此操作吗?