Spring-Boot配置用于抑制BatchDataInitializer

时间:2013-12-06 06:53:30

标签: spring-batch spring-boot

我在Spring-Batch中使用Spring-boot 0.5.0.M6。配置使用@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运行一种“更新”模式?

此致

1 个答案:

答案 0 :(得分: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类中。