From b5cc1cc72f744644b720298ee63ab441fa185a0f Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 5 Dec 2025 09:34:32 +0800 Subject: [PATCH] Improve retrieval of running job executions This commit could save one unnecessary query. See https://github.com/spring-projects/spring-batch/commit/57504927d912947ad1d15079b00d0969060db664 Signed-off-by: Yanming Zhou --- .../dao/jdbc/JdbcJobExecutionDao.java | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 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..840afc99e1 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 @@ -26,6 +26,7 @@ import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -106,7 +107,7 @@ SELECT COUNT(*) private static final String GET_RUNNING_EXECUTION_FOR_INSTANCE = """ SELECT E.JOB_EXECUTION_ID FROM %PREFIX%JOB_EXECUTION E, %PREFIX%JOB_INSTANCE I - WHERE E.JOB_INSTANCE_ID=I.JOB_INSTANCE_ID AND I.JOB_INSTANCE_ID=? AND E.STATUS IN ('STARTING', 'STARTED', 'STOPPING') + WHERE E.JOB_INSTANCE_ID=I.JOB_INSTANCE_ID AND I.JOB_NAME=? AND E.STATUS IN ('STARTING', 'STARTED', 'STOPPING') """; private static final String CURRENT_VERSION_JOB_EXECUTION = """ @@ -340,21 +341,10 @@ private long getJobInstanceId(long jobExecutionId) { @Override public Set findRunningJobExecutions(String jobName) { - final Set result = new HashSet<>(); - List jobInstanceIds = this.jobInstanceDao.getJobInstanceIds(jobName); - for (long jobInstanceId : jobInstanceIds) { - List runningJobExecutionIds = getJdbcTemplate() - .queryForList(getQuery(GET_RUNNING_EXECUTION_FOR_INSTANCE), Long.class, jobInstanceId); - if (runningJobExecutionIds.isEmpty()) { - continue; - } - // There should be only one running execution per job instance, enforced at - // startup time - Long jobExecutionId = runningJobExecutionIds.get(0); - JobExecution runningJobExecution = getJobExecution(jobExecutionId); - result.add(runningJobExecution); - } - return result; + return getJdbcTemplate().queryForList(getQuery(GET_RUNNING_EXECUTION_FOR_INSTANCE), Long.class, jobName) + .stream() + .map(this::getJobExecution) + .collect(Collectors.toSet()); } @Override