Skip to content

Commit e8354ae

Browse files
committed
Use batch inserts for job parameters
Use batch inserts for job parameters to reduce the number of database round trips.
1 parent 656e3f8 commit e8354ae

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.batch.core.repository.dao;
1818

19+
import java.sql.PreparedStatement;
1920
import java.sql.ResultSet;
2021
import java.sql.SQLException;
2122
import java.sql.Timestamp;
@@ -24,8 +25,8 @@
2425
import java.util.HashMap;
2526
import java.util.HashSet;
2627
import java.util.List;
28+
import java.util.Date;
2729
import java.util.Map;
28-
import java.util.Map.Entry;
2930
import java.util.Set;
3031

3132
import org.apache.commons.logging.Log;
@@ -63,6 +64,7 @@
6364
* @author Michael Minella
6465
* @author Mahmoud Ben Hassine
6566
* @author Dimitrios Liapis
67+
* @author Philippe Marschall
6668
*/
6769
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
6870

@@ -356,27 +358,34 @@ public void deleteJobExecutionParameters(JobExecution jobExecution) {
356358
*/
357359
private void insertJobParameters(Long executionId, JobParameters jobParameters) {
358360

359-
for (Entry<String, JobParameter<?>> entry : jobParameters.getParameters().entrySet()) {
360-
JobParameter jobParameter = entry.getValue();
361-
insertParameter(executionId, jobParameter.getType(), entry.getKey(), jobParameter.getValue(),
362-
jobParameter.isIdentifying());
361+
if (jobParameters.isEmpty()) {
362+
return;
363363
}
364+
365+
getJdbcTemplate().batchUpdate(getQuery(CREATE_JOB_PARAMETERS), jobParameters.getParameters().entrySet(), 100,
366+
(ps, entry) -> {
367+
JobParameter jobParameter = entry.getValue();
368+
insertParameter(ps, executionId, jobParameter.getType(), entry.getKey(), jobParameter.getValue(),
369+
jobParameter.isIdentifying());
370+
});
364371
}
365372

366373
/**
367374
* Convenience method that inserts an individual records into the JobParameters table.
375+
* @throws SQLException if the driver throws an exception
368376
*/
369-
private <T> void insertParameter(Long executionId, Class<T> type, String key, T value, boolean identifying) {
370-
371-
Object[] args = new Object[0];
372-
int[] argTypes = new int[] { Types.BIGINT, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.CHAR };
377+
private <T> void insertParameter(PreparedStatement preparedStatement, Long executionId, Class<T> type, String key,
378+
T value, boolean identifying) throws SQLException {
373379

374380
String identifyingFlag = identifying ? "Y" : "N";
375381

376382
String stringValue = this.conversionService.convert(value, String.class);
377-
args = new Object[] { executionId, key, type.getName(), stringValue, identifyingFlag };
378383

379-
getJdbcTemplate().update(getQuery(CREATE_JOB_PARAMETERS), args, argTypes);
384+
preparedStatement.setLong(1, executionId);
385+
preparedStatement.setString(2, key);
386+
preparedStatement.setString(3, type.getName());
387+
preparedStatement.setString(4, stringValue);
388+
preparedStatement.setString(5, identifyingFlag);
380389
}
381390

382391
/**

0 commit comments

Comments
 (0)