在做考试系统的时候,考试完成后需要教师判分,给我们的任务是允许多个教师同时判分,且判的题是不重复的,针对这个需求我设计了一个判分页面,每个教师按照题型,答题顺序判答题记录表的前20个题,但是,因为我设计的页面使用了静态变量,导致了一系列问题!
教师判分时出现的问题:
1,查的题型与显示不对应
2,下一批不起作用
3,报黄页
问题图示:
1,查的题型与显示不对应
说明:要判作文题,可是显示的却为翻译题,如上图:
2,下一批不起作用
说明:
要判的题型为整句翻译,可是tableName却为作文题题库表名,其他参数如试题id和题型都正确,导致找不到试题。也就是在作文题库中在试题id为翻译题的试题
3,报黄页
找不到某个表。例如:T_daxueyingyuoneyubeiji_Writing_Detail
原因:
如上的表在数据库中根本就不存在,也就是拼的表名不正确,why?
我们根据题型类型反射到具体的D层,然后根据题库名查询试题id的答题记录,正巧此题型无从表。也就是反射到复合式听力的D层,然后拼接表名时,复合式听力有从表固存在Detail,而我们传过来的TableName却为T_daxueyingyuoneyubeiji_Writing导致给作文添加了Detail--报错!
调试症状:静态变量中存放着题库表名,题库表名不正确,试题id和题型正确
问题1,根据正确的题型,在错误的题库表中找到了此试题id的答题记录---显示错位
问题2,根据正确的题型,在错误的题库表中找不到试题id---下一批不起作用
问题3,根据正确的题型,反射到此题型的D层,然后拼答题记录表,而正巧此题型不存在从表,也就是拼的表名数据库中根本不存在!
现在我们来看一下为什么会出现错位的情况:
前提:将题库表名存放在静态变量中
判分流程图示:
预想:
结果:
总结:
定义:静态变量始终存在着,也就是说它的生存期为整个源程序(程序中只保存一份)。
优点:访问频繁资源-速度快
缺点:
一直占用内存
高并发——逻辑混乱
影响多进程,多线程
耦合高
如上,大家已经看到了静态变量带来的问题,所以大家在使用时一定要慎用!
反思:
不做什么很重要:做事情之前,一定要明白什么不能用,即使要用,也要先了解清楚。
调试的重要性:当时的侧重点在于多个教师同时判同一类题是不是有问题,会不会出现并发的错误。当测试正常了,就以为没有问题了,万事大吉了,却忽略了多个教师判不同题型,不同试卷的问题了。因为判同类试卷同类题型,静态变量一直保持正确,不会触发错误!
遇到问题的态度:计算机不会欺骗我们,是什么就是什么,无论是静态变量还是锁或其他的,出现错误一定有它的触发点,只有弄明白到底是什么问题,以后遇到才不会惧怕,才知道什么时候可以用,什么时候不可以用,俗话说,知己知彼,百战不殆!