Spring-Batch で Spring-boot 0.5.0.M6 を使用しています。構成は、application.properties で構成されたデータソースなどで @EnableBatchProcessing を使用して行われます。
アプリケーションの最初の実行中はすべて正常に動作しますが、アプリケーションを停止して再起動すると、次のエラーが表示されます
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'
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:659)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:908)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:969)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:974)
掘り下げると、ログに次の行が表示されました
2013-12-06 12:12:37 INFO ResourceDatabasePopulator:162 - Executing SQL script from class path resource [org/springframework/batch/core/schema-mysql.sql]
2013-12-06 12:12:37 INFO ResourceDatabasePopulator:217 - Done executing SQL script from class path resource [org/springframework/batch/core/schema-mysql.sql] in 13 ms.
ここでの根本的な問題は、schema-drop-mysql.sql が schema-mysql.sql によってトリガーされなかったため、BATCH_JOB_SEQ に 2 つのエントリが作成されたことです。
同じ解決のために、私は追加しました
@EnableAutoConfiguration(exclude={BatchAutoConfiguration.class})
ただし、これにより、schema-mysql.sql を明示的に実行する必要があります。現時点では問題ありませんが、スキーマの更新で spring-batch バージョンが更新されると問題が発生します。
したがって、いくつかの質問があります。2. この BatchDatabaseInitializer を構成して、一種の「更新」モードを実行する方法はありますか?
よろしく