Преглед на файлове

[DS-7256][refactor] Optimization for task instances query (#7331)

- assemble a Map<Long, User> outside of the loop instead of the query inside

Co-authored-by: gq47193 <gq47193@ly.com>
mgduoduo преди 3 години
родител
ревизия
bc995752d6
променени са 1 файла, в които са добавени 6 реда и са изтрити 4 реда
  1. 6 4
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java

+ 6 - 4
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java

@@ -42,6 +42,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -137,12 +138,13 @@ public class TaskInstanceServiceImpl extends BaseServiceImpl implements TaskInst
         exclusionSet.add(Constants.CLASS);
         exclusionSet.add("taskJson");
         List<TaskInstance> taskInstanceList = taskInstanceIPage.getRecords();
-
+        List<Integer> executorIds = taskInstanceList.stream().map(TaskInstance::getExecutorId).distinct().collect(Collectors.toList());
+        List<User> users = usersService.queryUser(executorIds);
+        Map<Integer, User> userMap = users.stream().collect(Collectors.toMap(User::getId, v -> v));
         for (TaskInstance taskInstance : taskInstanceList) {
             taskInstance.setDuration(DateUtils.format2Duration(taskInstance.getStartTime(), taskInstance.getEndTime()));
-            User executor = usersService.queryUser(taskInstance.getExecutorId());
-            if (null != executor) {
-                taskInstance.setExecutorName(executor.getUserName());
+            if (userMap.containsKey(taskInstance.getExecutorId())) {
+                taskInstance.setExecutorName(userMap.get(taskInstance.getExecutorId()).getUserName());
             }
         }
         pageInfo.setTotal((int) taskInstanceIPage.getTotal());