Skip to content

Commit c707284

Browse files
marschallfmbenhassine
authored andcommitted
Use batch inserts for job parameters
Use batch inserts for job parameters to reduce the number of database round trips. Issue #3867
1 parent 89e7616 commit c707284

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

+20-11
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
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;
2223
import java.sql.Types;
2324
import java.util.HashMap;
2425
import java.util.HashSet;
2526
import java.util.List;
27+
import java.util.Date;
2628
import java.util.Map;
27-
import java.util.Map.Entry;
2829
import java.util.Set;
2930

3031
import org.apache.commons.logging.Log;
@@ -70,6 +71,7 @@
7071
* @author Michael Minella
7172
* @author Mahmoud Ben Hassine
7273
* @author Dimitrios Liapis
74+
* @author Philippe Marschall
7375
*/
7476
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
7577

@@ -376,27 +378,34 @@ public void deleteJobExecutionParameters(JobExecution jobExecution) {
376378
*/
377379
private void insertJobParameters(Long executionId, JobParameters jobParameters) {
378380

379-
for (Entry<String, JobParameter<?>> entry : jobParameters.getParameters().entrySet()) {
380-
JobParameter jobParameter = entry.getValue();
381-
insertParameter(executionId, jobParameter.getType(), entry.getKey(), jobParameter.getValue(),
382-
jobParameter.isIdentifying());
381+
if (jobParameters.isEmpty()) {
382+
return;
383383
}
384+
385+
getJdbcTemplate().batchUpdate(getQuery(CREATE_JOB_PARAMETERS), jobParameters.getParameters().entrySet(), 100,
386+
(ps, entry) -> {
387+
JobParameter jobParameter = entry.getValue();
388+
insertParameter(ps, executionId, jobParameter.getType(), entry.getKey(), jobParameter.getValue(),
389+
jobParameter.isIdentifying());
390+
});
384391
}
385392

386393
/**
387394
* Convenience method that inserts an individual records into the JobParameters table.
395+
* @throws SQLException if the driver throws an exception
388396
*/
389-
private <T> void insertParameter(Long executionId, Class<T> type, String key, T value, boolean identifying) {
390-
391-
Object[] args = new Object[0];
392-
int[] argTypes = new int[] { Types.BIGINT, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.CHAR };
397+
private <T> void insertParameter(PreparedStatement preparedStatement, Long executionId, Class<T> type, String key,
398+
T value, boolean identifying) throws SQLException {
393399

394400
String identifyingFlag = identifying ? "Y" : "N";
395401

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

399-
getJdbcTemplate().update(getQuery(CREATE_JOB_PARAMETERS), args, argTypes);
404+
preparedStatement.setLong(1, executionId);
405+
preparedStatement.setString(2, key);
406+
preparedStatement.setString(3, type.getName());
407+
preparedStatement.setString(4, stringValue);
408+
preparedStatement.setString(5, identifyingFlag);
400409
}
401410

402411
/**

0 commit comments

Comments
 (0)