Skip to content

Commit b775fe6

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 ba09001 commit b775fe6

File tree

1 file changed

+43
-29
lines changed

1 file changed

+43
-29
lines changed

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

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +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;
22+
import java.sql.Timestamp;
2123
import java.sql.Types;
2224
import java.util.HashMap;
2325
import java.util.HashSet;
2426
import java.util.List;
27+
import java.util.Date;
2528
import java.util.Map;
26-
import java.util.Map.Entry;
2729
import java.util.Set;
2830

2931
import org.apache.commons.logging.Log;
@@ -60,6 +62,7 @@
6062
* @author Michael Minella
6163
* @author Mahmoud Ben Hassine
6264
* @author Dimitrios Liapis
65+
* @author Philippe Marschall
6366
*/
6467
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
6568

@@ -320,42 +323,53 @@ public void synchronizeStatus(JobExecution jobExecution) {
320323
*/
321324
private void insertJobParameters(Long executionId, JobParameters jobParameters) {
322325

323-
for (Entry<String, JobParameter> entry : jobParameters.getParameters()
324-
.entrySet()) {
325-
JobParameter jobParameter = entry.getValue();
326-
insertParameter(executionId, jobParameter.getType(), entry.getKey(),
327-
jobParameter.getValue(), jobParameter.isIdentifying());
326+
if (jobParameters.isEmpty()) {
327+
return;
328328
}
329-
}
330329

330+
getJdbcTemplate().batchUpdate(getQuery(CREATE_JOB_PARAMETERS), jobParameters.getParameters().entrySet(), 100, (ps, entry) -> {
331+
JobParameter jobParameter = entry.getValue();
332+
String key = entry.getKey();
333+
ParameterType type = jobParameter.getType();
334+
Object value = jobParameter.getValue();
335+
boolean identifying = jobParameter.isIdentifying();
336+
setJobParameters(executionId, type, key, value, identifying, ps);
337+
});
338+
}
339+
331340
/**
332341
* Convenience method that inserts an individual records into the
333342
* JobParameters table.
334343
*/
335-
private void insertParameter(Long executionId, ParameterType type, String key,
336-
Object value, boolean identifying) {
337-
338-
Object[] args = new Object[0];
339-
int[] argTypes = new int[] { Types.BIGINT, Types.VARCHAR,
340-
Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.BIGINT,
341-
Types.DOUBLE, Types.CHAR };
342-
343-
String identifyingFlag = identifying? "Y":"N";
344-
344+
private static void setJobParameters(Long executionId, ParameterType type, String key,
345+
Object value, boolean identifying, PreparedStatement preparedStatement)
346+
throws SQLException {
347+
348+
preparedStatement.setLong(1, executionId);
349+
preparedStatement.setString(2, key);
350+
preparedStatement.setString(3, type.toString());
345351
if (type == ParameterType.STRING) {
346-
args = new Object[] { executionId, key, type, value, null,
347-
0L, 0D, identifyingFlag};
348-
} else if (type == ParameterType.LONG) {
349-
args = new Object[] { executionId, key, type, "", null,
350-
value, 0.0d, identifyingFlag};
351-
} else if (type == ParameterType.DOUBLE) {
352-
args = new Object[] { executionId, key, type, "", null, 0L,
353-
value, identifyingFlag};
354-
} else if (type == ParameterType.DATE) {
355-
args = new Object[] { executionId, key, type, "", value, 0L, 0D, identifyingFlag};
352+
preparedStatement.setString(4, (String) value);
353+
} else {
354+
preparedStatement.setString(4, "");
356355
}
357-
358-
getJdbcTemplate().update(getQuery(CREATE_JOB_PARAMETERS), args, argTypes);
356+
if (type == ParameterType.DATE) {
357+
preparedStatement.setTimestamp(5, new Timestamp(((Date) value).getTime()));
358+
} else {
359+
preparedStatement.setNull(5, Types.TIMESTAMP);
360+
}
361+
if (type == ParameterType.LONG) {
362+
preparedStatement.setLong(6, (Long) value);
363+
} else {
364+
preparedStatement.setLong(6, 0L);
365+
}
366+
if (type == ParameterType.DOUBLE) {
367+
preparedStatement.setDouble(7, (Double) value);
368+
} else {
369+
preparedStatement.setDouble(7, 0.0d);
370+
}
371+
String identifyingFlag = identifying ? "Y" : "N";
372+
preparedStatement.setString(8, identifyingFlag);
359373
}
360374

361375
/**

0 commit comments

Comments
 (0)