0

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 を構成して、一種の「更新」モードを実行する方法はありますか?

よろしく

4

1 に答える 1

3

spring.batch.initializer.enabled現在のバージョンの Spring Batch 自動構成では、プロパティを指定して に設定することで、データベース テーブルの自動作成を無効にすることができます。これは、次のバージョンでは不可能falseです。

私見では、自動作成/更新機能を使用してスキーマを作成しないでください。自分で作成するか、LiquiBaseFlyWayなどのツールを使用してより制御します。

https://stackoverflow.com/questions/8418814/db-migration-tool-liquibase-or-flywayも参照してください。

schema-drop-mysql.sql回避策として、このスクリプトを実行するクラスに@PreDestroyメソッドを追加できるため、いつでも自分で実行できます。(開発モード/プロファイルでのみ有効なクラスに@Configurationこれを追加することもできます)。@Configuration

于 2013-12-06T07:42:20.813 に答える