本文共 3006 字,大约阅读时间需要 10 分钟。
工时系统代码优化记录:
在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。
一年有12个月,一个人有多个项目。
初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库中获取该用用户的工时统计。
这样就造成了多次请求数据库,强求效率很低。差不多查询一次要2500ms的时间。这样肯定的不行的。
优化:优化采用每个项目只与数据库建立一次连接。采用存储过程进行调用。
这样就将数据库的连接次数大大减少了。
以下是没有优化前的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 工时系统: 查看工时详情,( 4 个项目为例子) 原来的代码请求数据库 2 * 12 * 4 + 1 = 97 次。 优化后的数据,请求数据库 5 次(首先查询所有的项目,然后每个项目去查询一次。) /* * 查询项目在每月已提交的工时 */ // 查询每个人的项目id List<WorkDetail> workDetailList = workDetailManager.getProjectIdByUser(userId); //第一次 List<Project> projectList = new ArrayList<>(); for (WorkDetail workDetail : workDetailList) { //循环4次 Integer projectId = workDetail.getProjectId(); Project project = projectManager.get(projectId); // 每月去查询 for ( int i = 0 ; i < countMonth; i++) { //循环12次 Double reportCount = new Double( "0" ); String workDay = String.valueOf(year) + months[i]; WorkDetailQuery query = new WorkDetailQuery(); query.setState( 10 ); query.setProjectId(projectId); query.setUserId(userId); // 如果当月还没有到月底,统计至当天的前一天为准。 Integer beforNowDay = Integer.valueOf(dateStr) - 1 ; if (workDay.equals(dateStr.substring( 0 , 6 ))) { query.setStartDate(workDay + "01" ); query.setEndDate(beforNowDay.toString()); query.setWorkType( "FUL" ); Integer fulCount1 = workDetailManager.count(query); //查询是半天还是全天 每月循环一次 query.setWorkType( "PAR" ); Integer parCount1 = workDetailManager.count(query); //查询是半天还是全天 每月循环一次 reportCount = (parCount1.doubleValue() / 2 ) + fulCount1.doubleValue(); } else { query.setWorkDay(Integer.valueOf(workDay)); query.setWorkType( "FUL" ); Integer fulCount = workDetailManager.count(query); query.setWorkType( "PAR" ); Integer parCount = workDetailManager.count(query); reportCount = (parCount.doubleValue() / 2 ) + fulCount.doubleValue(); } if (reportCount == 0.0 ) { reportCount = null ; } // 保存到每个月 if ( "01" .equals(months[i])) { project.setJanCount(reportCount); } else if ( "02" .equals(months[i])) { project.setFebCount(reportCount); } else if ( "03" .equals(months[i])) { project.setMarCount(reportCount); } else if ( "04" .equals(months[i])) { project.setAprCount(reportCount); } else if ( "05" .equals(months[i])) { project.setMayCount(reportCount); } else if ( "06" .equals(months[i])) { project.setJunCount(reportCount); } else if ( "07" .equals(months[i])) { project.setJulCount(reportCount); } else if ( "08" .equals(months[i])) { project.setAugCount(reportCount); } else if ( "09" .equals(months[i])) { project.set SeptCount(reportCount); } else if ( "10" .equals(months[i])) { project.setOctCount(reportCount); } else if ( "11" .equals(months[i])) { project.setNovCount(reportCount); } else if ( "12" .equals(months[i])) { project.setDecCount(reportCount); } } projectList.add(project); } |
优化后速度很大提升,请求时间一般为180ms,满足实际需求。
总结:报表查询中一定要减少请求数据库的次数。尽量采用多表查询或存储过程调用的方式。
本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1925239,如需转载请自行联系原作者