千家信息网

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

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


工时系统代码优化记录:

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

一年有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,满足实际需求。

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




查询 项目 数据 数据库 工时 代码 循环 个人 全天 时间 次数 系统 详情 过程 还是 存储 统计 效率 不行 很大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网巨头反垄断金融科技 朗新科技与工业互联网 互联网科技金融 喔噻互联网科技 互联网科技的英文 互联网 科技馆 济南和联互联网科技有限公司 卫星互联网科技股票 博兴的互联网电子科技公司 玖二柒互联网科技公司待遇 宁波青枫互联网科技有限公司 科技与互联网哪个更好 千方科技属于互联网企业吗 锡山区互联网智能科技产品供应 云鲸互联网络科技有限公司 陕西九四连强互联网科技有限公司 银川新华互联网科技学校是国营吗 长沙渺峰互联网科技有限公司 北京军民互联网科技公司 东风日产互联网科技公司叫什么 耶加雪菲 互联网科技公司税收优惠 杭州互联网科技公司 互联网科技创新企业排名 互联网科技创新服务 互联网与医疗科技 如何创新互联网科技 上海钢联属于互联网科技股吗 中天科技中国工业互联网 上海同邻互联网科技有限公司规模
0