我在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运行一种“更新”模式?
此致
答案 0 :(得分:3)
使用即将发布的版本无法实现的当前版本的Spring Batch自动配置,可以通过指定spring.batch.initializer.enabled
属性并将其设置为false
来禁用自动创建数据库表。 。
恕我直言,您不应该使用自动创建/更新功能来创建架构,或者自己动手,或者使用LiquiBase或FlyWay之类的工具来进行更多控制。
另见https://stackoverflow.com/questions/8418814/db-migration-tool-liquibase-or-flyway
您始终可以自己执行schema-drop-mysql.sql
,因为解决方法可能会向执行此脚本的@PreDestroy
类添加@Configuration
方法。 (也许你甚至可以将它添加到仅在开发模式/配置文件中启用的@Configuration
类中。