千家信息网

减少与数据库的连接,提高请求效率

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,工时系统代码优化记录:在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。一年有12个月,一个人有多个项目。初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库
千家信息网最后更新 2024年09月22日减少与数据库的连接,提高请求效率


工时系统代码优化记录:

在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。

一年有12个月,一个人有多个项目。

初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库中获取该用用户的工时统计。

这样就造成了多次请求数据库,强求效率很低。差不多查询一次要2500ms的时间。这样肯定的不行的。

优化:优化采用每个项目只与数据库建立一次连接。采用存储过程进行调用。

这样就将数据库的连接次数大大减少了。


以下是没有优化前的代码。

工时系统:查看工时详情,(4个项目为例子)原来的代码请求数据库2*12*4+1=97次。优化后的数据,请求数据库5次(首先查询所有的项目,然后每个项目去查询一次。)                /*                 * 查询项目在每月已提交的工时                 */                // 查询每个人的项目id                List workDetailList = workDetailManager.getProjectIdByUser(userId);//第一次                List 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.setSeptCount(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,满足实际需求。

总结:报表查询中一定要减少请求数据库的次数。尽量采用多表查询或存储过程调用的方式。




0