中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

減少與數據庫的連接,提高請求效率

發布時間:2020-07-21 05:33:56 來源:網絡 閱讀:765 作者:建波李 欄目:數據庫


工時系統代碼優化記錄:

在查看工時詳情的時候,我們需要將個人的工時分項目,每月進行一個展示。

一年有12個月,一個人有多個項目。

初始代碼只是為了實現功能,所以在代碼中進行的循環操作,即每個項目每月到數據庫中獲取該用用戶的工時統計。

這樣就造成了多次請求數據庫,強求效率很低。差不多查詢一次要2500ms的時間。這樣肯定的不行的。

優化:優化采用每個項目只與數據庫建立一次連接。采用存儲過程進行調用。

這樣就將數據庫的連接次數大大減少了。


以下是沒有優化前的代碼。

工時系統:
查看工時詳情,(4個項目為例子)
原來的代碼請求數據庫2*12*4+1=97次。
優化后的數據,請求數據庫5次(首先查詢所有的項目,然后每個項目去查詢一次。)

		/*
		 * 查詢項目在每月已提交的工時
		 */
		// 查詢每個人的項目id
		List<WorkDetail> workDetailList = workDetailManager.getProjectIdByUser(userId);//第一次
		List<Project> 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,滿足實際需求。

總結:報表查詢中一定要減少請求數據庫的次數。盡量采用多表查詢或存儲過程調用的方式。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大安市| 琼结县| 双江| 河池市| 丰城市| 塔城市| 白朗县| 龙岩市| 安龙县| 葵青区| 巴东县| 清河县| 余江县| 油尖旺区| 惠水县| 十堰市| 和平区| 织金县| 克东县| 凯里市| 威海市| 广元市| 宁国市| 沂南县| 凤凰县| 鄂州市| 平远县| 屏山县| 三亚市| 北辰区| 巨鹿县| 双鸭山市| 香河县| 翁牛特旗| 鸡泽县| 大宁县| 乐陵市| 潜江市| 玉溪市| 额尔古纳市| 阜城县|