# --spring.autoconfigure.exclude=...BatchJdbcAutoConfiguration: same job, same params, no memory $ java -jar target/spring-batch-1.0.0.jar --spring.profiles.active=clean \ --spring.autoconfigure.exclude=org.springframework.boot.batch.jdbc.autoconfigure.BatchJdbcAutoConfiguration \ --import.file=file:scenario-data/resourceless-demo/input.csv \ --spring.datasource.url=jdbc:h2:file:.../scenario-data/resourceless-demo/db -- run 1 -- REPORT: 58 products now in the PRODUCT table JOB FINISHED: status=COMPLETED exitCode=COMPLETED -- run 2: a second, completely fresh JVM, same jar, same job parameters, same PRODUCT table -- org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO PRODUCT (sku, name, price_cents) VALUES (?, ?, ?)]; Unique index or primary key violation: "PUBLIC.CONSTRAINT_18 INDEX PUBLIC.CONSTRAINT_INDEX_1 ON PUBLIC.PRODUCT(SKU NULLS FIRST) VALUES ( /* 1 */ 'ABC-0001' )"; SQL statement: Caused by: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO PRODUCT (sku, name, price_cents) VALUES (?, ?, ?)]; Unique index or primary key violation: "PUBLIC.CONSTRAINT_18 INDEX PUBLIC.CONSTRAINT_INDEX_1 ON PUBLIC.PRODUCT(SKU NULLS FIRST) VALUES ( /* 1 */ 'ABC-0001' )"; SQL statement: JOB FINISHED: status=FAILED exitCode=FAILED No JobInstanceAlreadyCompleteException on run 2 -- the resourceless JobRepository has no idea run 1 ever happened, so it tries the whole job again and collides with what run 1 already wrote to the PRODUCT table. With spring-boot-starter-batch-jdbc (the default configuration used everywhere else in this module) run 2 throws JobInstanceAlreadyCompleteException instead, which ImportRunner treats as "nothing to do" -- see docs/07-restartability.md.