`
wooce
  • 浏览: 184114 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

对按组织架构加载用户列表的程序性能的优化

    博客分类:
  • Java
 
阅读更多

组织架构是:  organization代表党委, branch代表党支部,  层级关系是  党委->党支部->用户. 

前端要把这个层级结构按树形加载出来全部用户列表,  结果加载缓慢, 等待的时间好像达到了十秒左右.

老杨查看审核了后端的代码如下所示:

			StringBuilder stringBuilder = new StringBuilder();
			List<Sys_Dictionary> orglist = userService.listByHQL("from Sys_Dictionary d where d.mcode='organization' and d.pcode='0' and d.isvalid='Y' order by d.orderby");
			stringBuilder.append("[");
			if (orglist.size() > 0) {
				for (Sys_Dictionary org : orglist) {
					stringBuilder.append("{");
					stringBuilder.append("\"id\":\"" + 0 + "\",");
					stringBuilder.append("\"text\":\"" + org.getName() + "\",");
					stringBuilder.append("\"children\":");

					List<Sys_Dictionary> branchlist = userService
							.listByHQL("from Sys_Dictionary d where d.mcode='org_branch' and d.pcode='" + org.getCode() + "' and d.isvalid='Y' and d.name in(select branch from Users group by branch) order by d.orderby");
					stringBuilder.append("[");
					if (branchlist.size() > 0) {
						for (Sys_Dictionary branch : branchlist) {
							stringBuilder.append("{");
							stringBuilder.append("\"id\":\"" + 0 + "\",");
							stringBuilder.append("\"text\":\"" + branch.getName() + "\",");
							stringBuilder.append("\"children\":");

							List<Users> userlist = userService.listByHQL("from Users u where u.organization='" +

							org.getName() + "' and u.branch='" + branch.getName() + "' and u.isvaild='Y' order by organization,branch");
							stringBuilder.append("[");
							if (userlist.size() > 0) {

								for (Users user : userlist) {
									stringBuilder.append("{");
									stringBuilder.append("\"id\":\"" + user.getId() + "\",");
									stringBuilder.append("\"text\":\"" + user.getName() +

									"\"");
									stringBuilder.append("},");
								}
								stringBuilder.setLength(stringBuilder.length() - 1);
							}
							stringBuilder.append("]");
							stringBuilder.append("}");
							stringBuilder.append(",");
						}
					}
					stringBuilder.setLength(stringBuilder.length() - 1);
					stringBuilder.append("]");
					stringBuilder.append("}");
					stringBuilder.append(",");
				}
				stringBuilder.setLength(stringBuilder.length() - 1);
				stringBuilder.append("]");

 

 看了代码就明白了, 代码的问题是在嵌套循环里多次执行数据库查询, 导致数据库查询这一开销比较高成本的执行次数过多, 经查看日志, 完成一次加载, 共发起执行了98次数据库查询操作 皱眉  

对这个的优化其实是小菜一碟, 老杨重写代码如下, 数据库查询次数减到只有三次, 经测试前端的树结构加载速度是大大提高了, 酷 

                        //written by Wooce Yang, 2016/1/19
			StringBuilder stringBuilder = new StringBuilder();
			List<Sys_Dictionary> orglist = userService.listByHQL("from Sys_Dictionary d where d.mcode='organization' and d.pcode='0' and d.isvalid='Y' order by d.orderby");
			List<Sys_Dictionary> branchlist = userService
					.listByHQL("from Sys_Dictionary d where d.mcode='org_branch' and d.isvalid='Y' order by d.orderby");
			List<Users> userlist = userService.listByHQL("from Users u where u.isvaild='Y' order by organization,branch");
			Map<String, Map<String,List<Users>> > jsonMap = new HashMap<>();
			for (Sys_Dictionary org : orglist) {
				Map<String,List<Users>> branchMap = new HashMap<>();
				for (Sys_Dictionary branch : branchlist) {
					if(branch.getPcode().equals(org.getCode())) {
						List<Users> uList = new ArrayList<Users>();
						for (Users user : userlist) {
							if(user.getOrganization()!=null && user.getOrganization().equals(org.getName()) && user.getBranch()!=null && user.getBranch().equals(branch.getName())) {
								uList.add(user);
							}
						}
						if(uList.size()>0)
							branchMap.put(branch.getName(),uList);
					}
				}
				if(branchMap.size()>0)
					jsonMap.put(org.getName(),branchMap);
			}

			stringBuilder.append("[");
			if (jsonMap.size() > 0) {
				for (Map.Entry<String, Map<String,List<Users>> > orgEntry: jsonMap.entrySet()) {
					stringBuilder.append("{");
					stringBuilder.append("\"id\":\"" + 0 + "\",");
					stringBuilder.append("\"text\":\"" + orgEntry.getKey() + "\",");
					stringBuilder.append("\"children\":");

					stringBuilder.append("[");
					Map<String,List<Users>> branchMap = orgEntry.getValue();
					if( branchMap.size()>0 ) {
						for (Map.Entry<String,List<Users>> branchEntry : branchMap.entrySet()) {
							stringBuilder.append("{");
							stringBuilder.append("\"id\":\"" + 0 + "\",");
							stringBuilder.append("\"text\":\"" + branchEntry.getKey() + "\",");
							stringBuilder.append("\"children\":");

							stringBuilder.append("[");
							List<Users> uList = branchEntry.getValue();
							if (uList.size() > 0) {
								for (Users user : uList) {
									stringBuilder.append("{");
									stringBuilder.append("\"id\":\"" + user.getId() + "\",");
									stringBuilder.append("\"text\":\"" + user.getName() +
											"\"");
									stringBuilder.append("},");
								}
								stringBuilder.setLength(stringBuilder.length() - 1);
							}
							stringBuilder.append("]");
							stringBuilder.append("}");
							stringBuilder.append(",");
						}
					}
					stringBuilder.setLength(stringBuilder.length() - 1);
					stringBuilder.append("]");
					stringBuilder.append("}");
					stringBuilder.append(",");
				}
				stringBuilder.setLength(stringBuilder.length() - 1);
				stringBuilder.append("]");

 

0
2
分享到:
评论

相关推荐

    仿钉钉组织架构通讯录功能

    6. **性能优化**:由于可能涉及大量的数据和视图,要注意优化加载和滚动性能,如使用懒加载、分页加载等策略,以及优化列表视图的复用机制。 通过以上步骤,我们便能构建出一个类似于钉钉的组织架构通讯录功能。这...

    asp.net组织架构控件

    - **性能优化**:通过延迟加载或分页加载技术,提高大规模数据展示的性能。 3. **实现方式** ASP.NET中的组织架构控件可以通过多种方式实现,比如使用第三方控件库(如Telerik、DevExpress等)提供的控件,或者...

    jsplumb组织架构流程图布局代码

    【jsPlumb组织架构流程图布局代码】是一个利用jQuery库和jsPlumb工具包构建的交互式图形化展示方案,主要用于描绘和管理组织结构或流程处理的可视化表示。jsPlumb是一个JavaScript库,它允许在HTML元素之间创建连接...

    网站性能优化教程

    网站性能优化教程主要聚焦于提升Web应用程序的加载速度和运行效率,从而提供更好的用户体验。这一领域涵盖了一系列技术和策略,旨在确保网页快速响应,减少用户等待时间,并提高整体的可用性和可访问性。以下是对这...

    组织架构代码,点击伸缩

    在IT行业中,组织架构代码通常指的是用于展示企业或组织内部结构的程序代码,这种结构可以是树状的,便于用户直观地理解各个部门及其下属单位的关系。"点击伸缩"的功能意味着用户可以通过点击来展开或折叠组织结构中...

    避免Flex RSL重复load 提高module加载性能的swc

    当用户首次访问应用程序时,仅加载核心模块,其他模块在用户需要时按需加载。这样可以显著减少初始加载时间,提升用户体验。 在实际操作中,可以使用Adobe Flex Builder或命令行工具(如mxmlc)来创建和编译SWC。在...

    SharePoint性能优化

    本篇文章将深入探讨SharePoint性能优化的各个方面,帮助您实现更流畅、响应更快的系统。 一、硬件配置优化 1. 服务器配置:SharePoint性能与硬件配置密切相关,包括CPU、内存、磁盘I/O和网络带宽。确保服务器有足够...

    jsplumb组织架构流程图布局代码.zip

    5. **流程图布局**:jsPlumb提供了多种布局模式,如树形布局、网格布局等,可以根据需求选择合适的布局方式来展示组织架构或流程。布局算法会自动调整节点的位置,确保连接线不会交叉,同时保持图形的清晰度。 6. *...

    自动化测试工具性能优化研究.pdf

    文章通过对案例的介绍和分析,提出了一系列性能优化措施,并对优化结果进行了统计和分析。 研究的组织结构如下:首先,简要概述相关工作,说明自动化测试的发展背景和趋势。其次,介绍案例并阐述本文需要解决的问题...

    微信小程序-微信小程序实现类似android下拉刷新上拉加载更多ListView.zip

    在微信小程序中,开发者可以创建出与Android应用中类似的下拉刷新和上拉加载更多的功能,这极大地提升了用户体验,使得用户能够方便地查看和获取更多数据。本项目着重讲解如何在微信小程序中实现这一功能,结合Java...

    笔记十二Egret分帧加载图形对象

    在本文中,我们将深入探讨Egret游戏引擎的分帧加载图形对象技术,这是一个关键的优化策略,尤其在处理大型游戏资源时显得尤为重要。Egret白鹭引擎是一款广泛使用的HTML5游戏开发工具,它提供了丰富的功能和高效的...

    代码优化与高性能计算.pptx

    代码优化是软件开发过程中一个重要的环节,它旨在提高程序的运行效率、减少资源消耗并改善用户体验。高性能计算(High Performance Computing, HPC)环境下,优化尤为重要,因为它直接关系到大规模数据处理和科学...

    海量数据环境下的Oracle数据库系统架构设计和优化思路.pdf

    - **对应用透明**:对外提供统一接口,简化应用程序的开发与维护。 - **灵活的扩展性**:可以根据业务需求动态添加或移除节点,实现系统的水平扩展。 - **数据冗余**:通过复制机制确保数据的安全性和可用性。 ####...

    内核组织架构.docx

    文档“内核组织架构.docx”主要探讨了Linux内核的组织结构,特别是启动过程、内存管理和文件系统等核心组件的细节。以下是基于文档内容的关键知识点的详细解释: 1. **启动过程**: - Boot目录下的.S文件是用GNU C...

    PHP自定义架构

    **性能优化**是架构设计中不可忽视的一环,包括但不限于缓存策略(如Redis、Memcached)、代码优化、数据库查询优化、使用opcode缓存(如OPcache)等。 最后,**持续集成/持续部署(CI/CD)**流程对于大型项目来说是...

    Qt中的tablewidget 通过分页方式加载大量数据

    - 分页加载的核心思想是按需加载,只在用户滚动到特定区域时加载相应的数据页。 - 首先,定义每一页的数据量(例如20行),然后计算总页数(总行数除以每页行数,向下取整)。 - 用户滚动时,获取当前可视区域的...

    多位前端架构设计

    在当今的IT行业,软件架构被看作是构建复杂系统的基础,它涉及众多层面的设计考虑,包括系统结构、模块划分、技术选型以及性能优化等。 首先,软件架构是为了解决大型系统复杂性问题而提出的一系列原则和模式。对于...

    用户树型结构

    在IT行业中,用户树型结构是一种常见的数据组织方式,尤其在设计用户管理、权限分配或者组织架构等场景中。这种结构通常表现为一个层次化的树状图,其中每个节点代表一个用户,而节点间的层级关系则反映了用户的上...

    树控件,支持无限级树,支持动态加载节点。不用自己写js

    本项目提供了一个自定义的树控件,特别强调了其支持无限级节点以及动态加载功能,这意味着用户可以构建深度任意的树结构,并且在需要时按需加载子节点,从而提高应用程序的性能和用户体验。 首先,无限级树是树控件...

Global site tag (gtag.js) - Google Analytics