fix: avoid global class initialization on task reads

main
chenyuan 6 days ago
parent 369182595a
commit 5d847faa42

@ -197,7 +197,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
}
sort++;
}
ensureAllTeachingClassTasks(trainingTaskMapper.selectList(null, null, null), operatorId);
// 班级任务在对应班级首次读取时按需初始化。不要在学生读取单个任务时遍历所有教学班,
// 否则班级数量增加会把每次页面切换的查询放大为全量写入检查。
}
@Override
@ -475,25 +476,6 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
return new ArrayList<>(existingByKey.values());
}
private void ensureAllTeachingClassTasks(List<TrainingTask> defaults, String operatorId) {
if (schoolClassMapper == null || trainingTaskClassConfigMapper == null) {
return;
}
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andClassTypeEqualTo("TEACHING");
List<SchoolClass> teachingClasses = schoolClassMapper.selectByExample(example);
if (teachingClasses == null || teachingClasses.isEmpty()) {
return;
}
for (SchoolClass teachingClass : teachingClasses) {
if (teachingClass == null || StringUtils.isBlank(teachingClass.getSchoolClassId())) {
continue;
}
String creator = StringUtils.defaultIfBlank(operatorId, teachingClass.getCreatedBy());
ensureClassTasksInitialized(teachingClass.getSchoolClassId(), defaults, creator);
}
}
private void synchronizeClassTaskDefaults(TrainingTask previousTask, TrainingTask updatedTask) {
if (schoolClassMapper == null || trainingTaskClassConfigMapper == null
|| previousTask == null || updatedTask == null) {

@ -332,6 +332,19 @@ class TrainingTaskServiceImplTest {
verify(service.jdbcTemplate).execute(startsWith("CREATE TABLE IF NOT EXISTS training_task_class_config"));
}
@Test
void ensureDefaultTasksDoesNotInitializeEveryTeachingClassDuringRead() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskMapper = mock(TrainingTaskMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
when(service.trainingTaskMapper.selectByTaskKey(anyString())).thenReturn(new TrainingTask());
service.ensureDefaultTasks("system");
verifyNoInteractions(service.schoolClassMapper, service.trainingTaskClassConfigMapper);
}
@Test
void listDoesNotFilterDisabledTasksWhenEnabledOnlyIsFalse() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
@ -346,7 +359,7 @@ class TrainingTaskServiceImplTest {
assertEquals(1, result.size());
assertFalse(result.get(0).getEnabled());
verify(service.trainingTaskMapper, times(2)).selectList(isNull(), isNull(), isNull());
verify(service.trainingTaskMapper).selectList(isNull(), isNull(), isNull());
}
@Test

Loading…
Cancel
Save