项目背景
时间短
记得当时报表由其他开发人员负责开发的,经过测试人员测试反馈业务数据不正确和查询速度慢的问题,从而导致项目进度被耽误。自己临时接手此报表工作,时间不充裕。
业务复杂度高
报表功能模块有七个子模块,其中三个核心模块(财务报表、分类报表、明细报表),每个子模块根据业务时间、业务类型、业务状态、业务名称等筛选条件统计出符合需求的数据,并且需要统计的原始数据来源多张业务表,业务涉及范围广,复杂度高。
代码复用性低
查看代码过程中发现代码耦合度太高,很多的方法里面都是上百行甚至几百行代码,很难在原有基础上进行修改优化,而且有些业务逻辑处理是将数据库中的表数据直接查询出来在业务层循环进行计算。整体上看代码的复用性低,最后选择重写。
优化设计
梳理业务,优化sql
业务上各个子模块的报表存在交叉重叠的地方,梳理出共性的业务数据,可以写成通用的sql查询方法,提高代码复用性。部分原始数据可以在sql语句上进行分组聚合,而不是带到代码层去循环计算。给sql语句添加索引进行优化,以及其他sql优化处理方式。(ps:后续单独再写在项目具体场景中的优化情况)
添加天、时、分预存储数据表
使用数据源同步工具(例如:datax)将原始数据统计到分、时、天表中。例如将原始表中的数据按每10分钟时间段根据相关业务聚合为一条数据统计到分钟表中,每1小时时间段数据聚合为一条数据统计到小时表中,每天时间段数据聚合为一条数据统计到天表中。然后将天、时、分和实时数据在代码业务层进行合并。这样就极大的优化了报表查询性能,真正考验性能的地方就是实时查询10分钟以内的数据量。
采用java8中流特性优化
采用java8中stream和parallelStream(并发操作)去处理数据。这种方式能有效提高性能。
计划
后续将从数据源同步工具datax的使用到java8函数处理数据的使用去详细讲解,敬请期待!
更多文章
log4j2自定义动态配置日志
开关配置springboot定时任务
重复请求的幂等接口设计的思考(一)
三年程序员的第一篇公号文章
自动化远程登陆操作和传输文件(scp ssh expect)
长按二维码关注,阅读我的程序员故事