您好,登錄后才能下訂單哦!
工時系統代碼優化記錄:
在查看工時詳情的時候,我們需要將個人的工時分項目,每月進行一個展示。
一年有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,滿足實際需求。
總結:報表查詢中一定要減少請求數據庫的次數。盡量采用多表查詢或存儲過程調用的方式。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。