减少与数据库的连接,提高请求效率
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,工时系统代码优化记录:在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。一年有12个月,一个人有多个项目。初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库
千家信息网最后更新 2025年02月01日减少与数据库的连接,提高请求效率
工时系统代码优化记录:
在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。
一年有12个月,一个人有多个项目。
初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库中获取该用用户的工时统计。
这样就造成了多次请求数据库,强求效率很低。差不多查询一次要2500ms的时间。这样肯定的不行的。
优化:优化采用每个项目只与数据库建立一次连接。采用存储过程进行调用。
这样就将数据库的连接次数大大减少了。
以下是没有优化前的代码。
工时系统:查看工时详情,(4个项目为例子)原来的代码请求数据库2*12*4+1=97次。优化后的数据,请求数据库5次(首先查询所有的项目,然后每个项目去查询一次。) /* * 查询项目在每月已提交的工时 */ // 查询每个人的项目id ListworkDetailList = 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安全错误
数据库的锁怎样保障安全
数据库管理技术的发展不包括
杭州协同软件开发
软件开发的行业代码是多少
数据库 键
安卓软件开发工程师工资待遇
宁夏网络安全等保备案流程
网络安全黑板报初中
网络安全班会主持演讲稿
服务器降低功耗的办法
数据库技术APPT
车载网络技术视频讲解
苏州阿里云数据库搭建
网络技术基础名词ftp解释
服务器sas硬盘接线图
网络安全日那年
bim软件开发工程考试流程
垃圾网络中的服务器是指
北京物流软件开发商
全市网络安全隐患排查工作方案
运城软件开发厂家报价
广电网络安全事件典型分析
组件软件开发团队
如何写一个好的文件服务器
网络技术升级新型文化产业
数据库一个表可以没有主键吗
天津服务器配套机柜云主机
数据库表的某列添加多个数据
数据库三大表达式
电力局网络安全值班员岗位考试
中国神州网络技术