diff --git a/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.java b/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.java index d6332f0..2ec121f 100644 --- a/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.java +++ b/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; +import java.util.List; @Mapper public interface SyncUserInfoLogMapper extends MyBatisBaseMapper { @@ -22,4 +23,6 @@ public interface SyncUserInfoLogMapper extends MyBatisBaseMapper batchFindUserInfoByStuUserIds(@Param("stuUserIds") List stuUserIds); } diff --git a/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.xml b/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.xml index d86ce09..a900ad7 100644 --- a/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.xml +++ b/src/main/java/cn/wepact/dfm/training/mapper/SyncUserInfoLogMapper.xml @@ -150,4 +150,11 @@ + + diff --git a/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.java b/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.java index 437da6a..4d558c2 100644 --- a/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.java +++ b/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.java @@ -22,4 +22,11 @@ public interface TUserMapper extends MyBatisBaseMapper { */ Long findUserIdByUsername(@Param("username") String username); + + /** + * 批量查询用户ID(替代 N+1 循环查询) + * @param usernames 用户名列表 + * @return username -> userId 映射列表 + */ + List batchFindUserIdByUsernames(@Param("usernames") List usernames); } diff --git a/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.xml b/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.xml index eaa3379..b94c772 100644 --- a/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.xml +++ b/src/main/java/cn/wepact/dfm/training/mapper/TUserMapper.xml @@ -189,5 +189,12 @@ + + + diff --git a/src/main/java/cn/wepact/dfm/training/service/SyncTaskService.java b/src/main/java/cn/wepact/dfm/training/service/SyncTaskService.java index c99f389..539e1ec 100644 --- a/src/main/java/cn/wepact/dfm/training/service/SyncTaskService.java +++ b/src/main/java/cn/wepact/dfm/training/service/SyncTaskService.java @@ -304,21 +304,51 @@ public class SyncTaskService { responseJson = new JSONObject(responseData); dataArray = responseJson.getJSONArray("data"); + // 第一遍:收集所有 stuUserId,批量查询用户信息(替代 N+1) + List stuUserIds = new ArrayList<>(dataArray.size()); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject taskData = dataArray.getJSONObject(i); + String stuUserId = getStringValue(taskData, "stuUserId"); + if (!stuUserId.isEmpty()) { + stuUserIds.add(stuUserId); + } + } + // 批量查询:sync_user_info_log(stuUserId → username) + Map stuUserIdToUsername = new HashMap<>(); + if (!stuUserIds.isEmpty()) { + List userInfos = syncUserInfoLogMapper.batchFindUserInfoByStuUserIds(stuUserIds); + for (SyncUserInfoLog info : userInfos) { + if (info.getUserId() != null && info.getUsername() != null) { + stuUserIdToUsername.put(info.getUserId(), info.getUsername()); + } + } + } + // 批量查询:t_user(username → userId) + List usernames = new ArrayList<>(stuUserIdToUsername.values()); + Map usernameToUserId = new HashMap<>(); + if (!usernames.isEmpty()) { + List tUsers = userMapper.batchFindUserIdByUsernames(usernames); + for (TUser tUser : tUsers) { + if (tUser.getUserNo() != null) { + usernameToUserId.put(tUser.getUserNo(), tUser.getId()); + } + } + } + for (int i = 0; i < dataArray.size(); i++) { JSONObject taskData = dataArray.getJSONObject(i); // 从任务数据中获取学生用户ID String stuUserId = getStringValue(taskData, "stuUserId"); + if (stuUserId.isEmpty()) continue; - - - // 1. 获取用户信息:根据云学堂的学生用户ID查询本地用户信息 - SyncUserInfoLog userInfo = syncUserInfoLogMapper.findUserInfoByStuUserId(stuUserId); - if (userInfo == null) { + // 1. 从缓存中获取用户信息 + String username = stuUserIdToUsername.get(stuUserId); + if (username == null) { continue; // 如果在本地数据库中找不到对应的用户信息,跳过当前记录的处理 } - // 2. 获取系统内部的user_id:通过用户名查找对应的用户ID - Long userId = userMapper.findUserIdByUsername(userInfo.getUsername()); + // 2. 从缓存中获取系统内部的user_id + Long userId = usernameToUserId.get(username); if (userId == null) { continue; // 如果找不到对应的用户ID,跳过当前记录的处理 } @@ -535,15 +565,42 @@ public class SyncTaskService { } public void processTaskScores(List taskScoreSummaries) { + // 批量查询用户信息缓存(替代 N+1) + List stuUserIds = new ArrayList<>(taskScoreSummaries.size()); for (TaskScoreSummary summary : taskScoreSummaries) { - // 1. 获取用户信息 - SyncUserInfoLog userInfo = syncUserInfoLogMapper.findUserInfoByStuUserId(summary.getStuUserId()); - if (userInfo == null) { + if (summary.getStuUserId() != null) { + stuUserIds.add(summary.getStuUserId()); + } + } + Map stuUserIdToUsername = new HashMap<>(); + if (!stuUserIds.isEmpty()) { + List userInfos = syncUserInfoLogMapper.batchFindUserInfoByStuUserIds(stuUserIds); + for (SyncUserInfoLog info : userInfos) { + if (info.getUserId() != null && info.getUsername() != null) { + stuUserIdToUsername.put(info.getUserId(), info.getUsername()); + } + } + } + List usernames = new ArrayList<>(stuUserIdToUsername.values()); + Map usernameToUserId = new HashMap<>(); + if (!usernames.isEmpty()) { + List tUsers = userMapper.batchFindUserIdByUsernames(usernames); + for (TUser tUser : tUsers) { + if (tUser.getUserNo() != null) { + usernameToUserId.put(tUser.getUserNo(), tUser.getId()); + } + } + } + + for (TaskScoreSummary summary : taskScoreSummaries) { + // 1. 从缓存中获取用户信息 + String username = stuUserIdToUsername.get(summary.getStuUserId()); + if (username == null) { continue; // 如果没有找到用户信息,跳过 } - // 2. 获取 user_id - Long userId = userMapper.findUserIdByUsername(userInfo.getUsername()); + // 2. 从缓存中获取 user_id + Long userId = usernameToUserId.get(username); if (userId == null) { continue; // 如果没有找到用户 ID,跳过 } diff --git a/src/main/java/cn/wepact/dfm/training/service/SyncUserInfoService.java b/src/main/java/cn/wepact/dfm/training/service/SyncUserInfoService.java index db0782f..9355893 100644 --- a/src/main/java/cn/wepact/dfm/training/service/SyncUserInfoService.java +++ b/src/main/java/cn/wepact/dfm/training/service/SyncUserInfoService.java @@ -6,6 +6,7 @@ import cn.hutool.json.JSONObject; import cn.wepact.dfm.training.dto.SyncRequest; import cn.wepact.dfm.training.dto.entity.SyncTaskLog; import cn.wepact.dfm.training.dto.entity.SyncUserInfoLog; +import cn.wepact.dfm.training.dto.entity.TUser; import cn.wepact.dfm.training.mapper.SyncUserInfoLogMapper; import cn.wepact.dfm.training.mapper.TUserMapper; import cn.wepact.dfm.training.util.HttpClientUtil; @@ -33,8 +34,10 @@ import java.math.BigDecimal; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; @Service @@ -199,6 +202,26 @@ public class SyncUserInfoService { return; } + // 第一遍:收集所有用户名,批量查询用户ID(替代 N+1 逐条查询) + List usernames = new ArrayList<>(dataArray.size()); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObject = dataArray.getJSONObject(i); + if (dataObject == null) continue; + String u = getStringValue(dataObject, "username"); + if (!u.isEmpty()) { + usernames.add(u); + } + } + Map userIdCache = new HashMap<>(); + if (!usernames.isEmpty()) { + List tUsers = userMapper.batchFindUserIdByUsernames(usernames); + for (TUser tUser : tUsers) { + if (tUser.getUserNo() != null) { + userIdCache.put(tUser.getUserNo(), tUser.getId()); + } + } + } + for (int i = 0; i < dataArray.size(); i++) { JSONObject dataObject = dataArray.getJSONObject(i); if (dataObject == null) { @@ -213,8 +236,8 @@ public class SyncUserInfoService { continue; } - // 获取系统内部的user_id - Long userId = userMapper.findUserIdByUsername(username); + // 从批量查询的缓存中获取系统内部的user_id + Long userId = userIdCache.get(username); if (userId == null) { logger.warn("未找到用户: {}", username); continue; diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 7327662..2cae964 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -79,12 +79,12 @@ - - + + - +