减少与数据库的连接,提高请求效率
admin
2023-05-24 16:22:33
0


工时系统代码优化记录:

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

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

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




相关内容

热门资讯

万斯:美伊谈判取得“很大进展” △5月19日,美国副总统万斯在白宫新闻简报会上当地时间5月19日,美国副总统万斯在白宫新闻简报会上表...
全环境立德树人|广饶县:“科普... 近日,一场别开生面的 “科普漂流”活动在东营市科技馆火热启程。来自广饶县的40余名青少年走出课堂,在...
西安AI数字人选择指南 在西安,AI数字人已经从概念走向了实实在在的应用。无论是企业宣传、短视频制作,还是直播带货,数字人正...
10分钟飞越深山!无人机送出“... 在四川省雅安市汉源县唐家镇尚礼村,一架满载新鲜甜樱桃的无人机从海拔1500米的起飞点缓缓升空,平稳驶...
能源金融双线突破,西方制裁反证... 01五月北京:全球外交焦点汇聚,中俄高层会晤启新程今年5月,全球外交的钟摆,正以前所未有的高频在北京...
不仅要把人工智能送上天,长三角... 能够在3分钟内完成未来60天天气预测的“伏羲”气象模型,如今正实时加工着来自太空的“一手”气象数据。...
追觅创始人俞浩称无比感谢雷军:... 【CNMO科技消息】据CNMO科技了解,追觅科技创始人兼CEO俞浩近日在访谈中回顾了公司早期获得小米...
跑遍多家官方旗舰店!2026手... 大家好,我是小杨。说实话,写这篇文章之前,我花了整整一个周末,把各大手机官方旗舰店挨个逛了一遍。不是...
AMD AI开发者大会首次在中... IT之家 5 月 19 日消息,今天,AMD AI 开发者大会(AMD AI DevDay 2026...
警惕!这些“高科技疗愈”全是骗... 本文转自【光明日报】; 当前,一些不法分子打着“生命科学”等名义,编造“脑波修复”“能量疗愈”“光波...