From 38617ce39df530b2cc34330073a3371d9cec5329 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 5 Dec 2025 09:58:41 +0800 Subject: [PATCH] Improve `JdbcJobExecutionDao::getJobExecution` `JOB_INSTANCE_ID` exists in table `JOB_EXECUTION`, no need to query it from table `JOB_INSTANCE`. Signed-off-by: Yanming Zhou --- .../dao/jdbc/JdbcJobExecutionDao.java | 27 +++++-------------- .../dao/jdbc/JobExecutionRowMapper.java | 17 +++++++----- .../dao/jdbc/JdbcJobExecutionDaoTests.java | 15 +++++++++++ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDao.java index 07b0de632a..fbd355e4c3 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDao.java @@ -90,18 +90,17 @@ SELECT COUNT(*) WHERE JOB_EXECUTION_ID = ? AND VERSION = ? """; - private static final String GET_JOB_EXECUTIONS = """ - SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION - FROM %PREFIX%JOB_EXECUTION - """; - private static final String GET_LAST_JOB_EXECUTION_ID = """ SELECT JOB_EXECUTION_ID FROM %PREFIX%JOB_EXECUTION WHERE JOB_INSTANCE_ID = ? AND JOB_EXECUTION_ID IN (SELECT MAX(JOB_EXECUTION_ID) FROM %PREFIX%JOB_EXECUTION E2 WHERE E2.JOB_INSTANCE_ID = ?) """; - private static final String GET_EXECUTION_BY_ID = GET_JOB_EXECUTIONS + " WHERE JOB_EXECUTION_ID = ?"; + private static final String GET_EXECUTION_BY_ID = """ + SELECT JOB_EXECUTION_ID, JOB_INSTANCE_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION + FROM %PREFIX%JOB_EXECUTION + WHERE JOB_EXECUTION_ID = ? + """; private static final String GET_RUNNING_EXECUTION_FOR_INSTANCE = """ SELECT E.JOB_EXECUTION_ID @@ -136,12 +135,6 @@ SELECT COUNT(*) WHERE JOB_EXECUTION_ID = ? """; - private static final String GET_JOB_INSTANCE_ID_FROM_JOB_EXECUTION_ID = """ - SELECT JI.JOB_INSTANCE_ID - FROM %PREFIX%JOB_INSTANCE JI, %PREFIX%JOB_EXECUTION JE - WHERE JOB_EXECUTION_ID = ? AND JI.JOB_INSTANCE_ID = JE.JOB_INSTANCE_ID - """; - private static final String GET_JOB_EXECUTION_IDS_BY_INSTANCE_ID = """ SELECT JOB_EXECUTION_ID FROM %PREFIX%JOB_EXECUTION WHERE JOB_INSTANCE_ID = ? ORDER BY JOB_EXECUTION_ID DESC @@ -321,23 +314,15 @@ public JobExecution getLastJobExecution(JobInstance jobInstance) { @Override public JobExecution getJobExecution(long jobExecutionId) { - long jobInstanceId = getJobInstanceId(jobExecutionId); - JobInstance jobInstance = jobInstanceDao.getJobInstance(jobInstanceId); - JobParameters jobParameters = getJobParameters(jobExecutionId); try { return getJdbcTemplate().queryForObject(getQuery(GET_EXECUTION_BY_ID), - new JobExecutionRowMapper(jobInstance, jobParameters), jobExecutionId); + new JobExecutionRowMapper(jobInstanceDao::getJobInstance, this::getJobParameters), jobExecutionId); } catch (EmptyResultDataAccessException e) { return null; } } - private long getJobInstanceId(long jobExecutionId) { - return getJdbcTemplate().queryForObject(getQuery(GET_JOB_INSTANCE_ID_FROM_JOB_EXECUTION_ID), Long.class, - jobExecutionId); - } - @Override public Set findRunningJobExecutions(String jobName) { final Set result = new HashSet<>(); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JobExecutionRowMapper.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JobExecutionRowMapper.java index 33be734380..4731ac83aa 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JobExecutionRowMapper.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/jdbc/JobExecutionRowMapper.java @@ -2,6 +2,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.function.Function; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ExitStatus; @@ -13,11 +14,13 @@ /** * @author Dave Syer * @author Mahmoud Ben Hassine + * @author Yanming Zhou *

* Expects a result set with the following columns: * *

    * * *
  • JOB_EXECUTION_ID
  • * + *
  • JOB_INSTANCE_ID
  • * *
  • START_TIME
  • * *
  • END_TIME
  • * *
  • STATUS
  • * @@ -31,19 +34,21 @@ */ class JobExecutionRowMapper implements RowMapper { - private final JobInstance jobInstance; + private final Function jobInstanceMapper; - private final JobParameters jobParameters; + private final Function jobParametersMapper; - public JobExecutionRowMapper(JobInstance jobInstance, JobParameters jobParameters) { - this.jobInstance = jobInstance; - this.jobParameters = jobParameters; + public JobExecutionRowMapper(Function jobInstanceMapper, + Function jobParametersMapper) { + this.jobInstanceMapper = jobInstanceMapper; + this.jobParametersMapper = jobParametersMapper; } @Override public JobExecution mapRow(ResultSet rs, int rowNum) throws SQLException { long id = rs.getLong("JOB_EXECUTION_ID"); - JobExecution jobExecution = new JobExecution(id, this.jobInstance, this.jobParameters); + JobExecution jobExecution = new JobExecution(id, this.jobInstanceMapper.apply(rs.getLong("JOB_INSTANCE_ID")), + this.jobParametersMapper.apply(id)); jobExecution.setStartTime( rs.getTimestamp("START_TIME") == null ? null : rs.getTimestamp("START_TIME").toLocalDateTime()); jobExecution diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDaoTests.java index 505a6d8ed2..9fc3062353 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/jdbc/JdbcJobExecutionDaoTests.java @@ -39,6 +39,7 @@ /** * @author Parikshit Dutta * @author Mahmoud Ben Hassine + * @author Yanming Zhou */ public class JdbcJobExecutionDaoTests { @@ -90,6 +91,20 @@ void testCreateJobExecution() { Assertions.assertEquals(1, batchJobExecutionsCount); } + @Test + void testGetJobExecution() { + // given + JobParameters jobParameters = new JobParameters(); + JobInstance jobInstance = jdbcJobInstanceDao.createJobInstance("job", jobParameters); + + // when + JobExecution createdJobExecution = jdbcJobExecutionDao.createJobExecution(jobInstance, jobParameters); + JobExecution retrievedJobExecution = jdbcJobExecutionDao.getJobExecution(createdJobExecution.getId()); + + // then + Assertions.assertEquals(createdJobExecution, retrievedJobExecution); + } + @Test void testDeleteJobExecution() { // given