减少与数据库的连接,提高请求效率
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,工时系统代码优化记录:在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。一年有12个月,一个人有多个项目。初始代码只是为了实现功能,所以在代码中进行的循环操作,即每个项目每月到数据库
千家信息网最后更新 2025年11月07日减少与数据库的连接,提高请求效率
工时系统代码优化记录:
在查看工时详情的时候,我们需要将个人的工时分项目,每月进行一个展示。
一年有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安全错误
数据库的锁怎样保障安全
软件开发怎么分级别
土豆服务器干什么的
网络技术 计算机3级
中国移动软件开发工资
怎么打开数据库窗口
vb怎么连接远程数据库
二手笔记本做软件开发
x86服务器 趋势
信息会考网络技术应用试题
无线网络技术研究展望
国际网络安全法律
网络安全应该是什么样的
有关网络安全新闻
小型公司有哪些数据库
建模软件开发哪家强
锦州网络技术员
正规网络技术咨询信息推荐
计算机网络技术攻防
服务器信息安全策略
php 数据库长连接
metronic 数据库
新加坡网络安全产业
扬州数据库兴趣班
数字媒体与软件开发有关系吗
电脑网络安全证书错误怎么办
数据库局部变量的表示方法
校园网络安全 展板
qq游戏与服务器断开连接
数据库要学多少东西
ie网络安全