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++; sort++;
} }
ensureAllTeachingClassTasks(trainingTaskMapper.selectList(null, null, null), operatorId); // 班级任务在对应班级首次读取时按需初始化。不要在学生读取单个任务时遍历所有教学班,
// 否则班级数量增加会把每次页面切换的查询放大为全量写入检查。
} }
@Override @Override
@ -475,25 +476,6 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
return new ArrayList<>(existingByKey.values()); 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) { private void synchronizeClassTaskDefaults(TrainingTask previousTask, TrainingTask updatedTask) {
if (schoolClassMapper == null || trainingTaskClassConfigMapper == null if (schoolClassMapper == null || trainingTaskClassConfigMapper == null
|| previousTask == null || updatedTask == 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")); 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 @Test
void listDoesNotFilterDisabledTasksWhenEnabledOnlyIsFalse() { void listDoesNotFilterDisabledTasksWhenEnabledOnlyIsFalse() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
@ -346,7 +359,7 @@ class TrainingTaskServiceImplTest {
assertEquals(1, result.size()); assertEquals(1, result.size());
assertFalse(result.get(0).getEnabled()); assertFalse(result.get(0).getEnabled());
verify(service.trainingTaskMapper, times(2)).selectList(isNull(), isNull(), isNull()); verify(service.trainingTaskMapper).selectList(isNull(), isNull(), isNull());
} }
@Test @Test

Loading…
Cancel
Save