一、数据
截止19年11月29日。
我个人负责模块客户数据:40902条。
核心业务数据共收到:69321条。
成绩排名:计算出来合法数据共:35325条。程序执行时间:约40分钟。
中位数情况:计算出来合法数据:2288条。程序执行时间:约1分钟。基于成绩排名结果表。
学分综合情况:计算出来合法数据:3168条。程序执行时间:约1小时。共处理4学年,跨度7个年级。时间最大跨度7学年,最大10个年级。按照当前用户量与核心业务数据数据量,每一个学年处理约25分钟。最大程序执行时间预计应不超过2小时。
二、教训
数据库字段设计为not null,结果实施同事还是塞了空字符串。因此,一定要在运行程序之前,帮助实施人员检查数据。
不能完全依赖数据库,加了索引也没有用。实测索引可能减少50%的查询时间,但是仍然有超过3万条数据需要查询。耗时3到5秒,性能很差,现在最懊恼的就是这一点。没有通过定时任务处理,直接查询了原始数据表。
当数据量上十万、百万级别,一定要提前处理。坚决不直接查询原始表,一定要创建业务类的结果表。这个错误在设计阶段我就犯错了。
线上环境非常担心OOM,程序在执行的时候就令我焦虑不安。如果不加以控制,内存撑爆,背大锅。测试人员无法测试OOM,毕竟谁都造不出那么多数据。一定要拆解维度、增加循环!一定要!
三、后记
好马不会在同一个地方摔倒两次,同一个错误不能犯两次。
还有就是,准备挨批。
在老大的指导下,把一个运行一小时的程序缩短为不超过5分钟。。。。
其他大佬给了一个监控JVM的工具。内存顶峰为700M,应该在线上OOM是不存在的。