0

我将 Spring-boot 0.5.0.M6 与 Spring-Batch 一起使用。配置通过使用 @EnableBatchProcessing 和 application.properties 中配置的数据源等。

在应用程序首次运行期间,一切正常,但在我停止应用程序并重新启动应用程序后,出现以下错误

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 中创建了两个条目。

对于相同的解决方案,我添加了

@EnableAutoConfiguration(exclude={BatchAutoConfiguration.class})

但是由于这个原因,我需要显式执行 schema-mysql.sql,到目前为止还可以,但是当 spring-batch 版本将使用模式中的更新进行更新时会出现问题

因此有几个问题: 1. 如何自动配置批处理,甚至在 schema-mysql.sql 之前执行 schema-drop-mysql.sql?2. 有没有办法将此 BatchDatabaseInitializer 配置为运行一种“更新”模式?

问候

4

1 回答 1

3

使用当前版本的 Spring Batch 自动配置(即将发布的版本无法实现),可以通过指定spring.batch.initializer.enabled属性并将其设置为来禁用数据库表的自动创建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 回答