`
wooce
  • 浏览: 180588 次
  • 性别: 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
分享到:
评论

相关推荐

    asp.net知识库

    完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) ...

    Spring面试题

    当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的...

    基于OpenCV深度学习神经网络人脸模块(OpenCV DNN Face)的实时人脸识别程序.zip

    高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API...

    通过HOG+SVM训练进行行人检测,行人数据库使用INRIAPerson,程序基于OpenCV实现.zip

    高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API...

    基于Opencv框架和MFC相结合的小程序,操作笔记本电脑摄像头,完成拍照摄像图片渲染等功能.zip

    高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API...

    ExtJS(ajax框架) 4.2.1

    ExtJs最开始基于YUI技术,由开发人员 JackSlocum开发,通过参考JavaSwing等机制来组织可视化组件,无论从UI界面上CSS样式的应用,到数据解析上的异常处理,都可算是 一款不可多得的JavaScript客户端技术的精品。 ...

    PHP和MySQL WEB开发(第4版)

    15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计与日志...

    PHP和MySQL Web开发第4版pdf以及源码

    15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计...

    PHP和MySQL Web开发第4版

    15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计...

    GDI+_SDK参考.pdf

    Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是...

    【卷一/共两卷】AJAX实战pdf高清版90M

    2.4 用DOM组织视图 2.4.1 使用JavaScript操作DOM 2.4.2 寻找DOM节点 2.4.3 创建DOM节点 2.4.4 为文档增加样式 2.4.5 捷径:使用innerHTML属性 2.5 使用XML技术异步加载数据 2.5.1 IFrame 2.5.2 XMLDocument和...

    使用BiSeNet做人脸面部解析.zip

    包含了基于pytorch, opencv, onnxruntime三种库的程序实现,并且比较了在调用三种库的输入和输出的差异 OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,...

    C#微软培训资料

    第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 结 .213 第十七章 文 件 操 作 .215 17.1 .Net 框架结构提供的 I/O ...

    新版Android开发教程.rar

    用户,对商业用户支持尚弱。 Android Android Android Android 带来的影响 ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面...

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    10.2.3 devicehigh——加载驱动程序到高内存区 449 10.2.4 echoconfig——显示消息 449 10.2.5 endlocal——本地化操作 450 10.2.6 set——设置环境变量 450 10.2.7 setlocal——环境变量的本地化 452 10.3 管道和...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    2.2 磁盘优化 69 2.2.1 chkdsk——磁盘检查 69 2.2.2 defrag——磁盘碎片整理 71 2.2.3 compact——NTFS压缩 73 2.3 磁盘管理与卷标管理 74 2.3.1 diskprt——磁盘和分区管理 75 2.3.2 diskcopy——磁盘复制 79 ...

    精通windows server 2008 命令行与powershell 电子书PDF版(第四卷)

    2.2 磁盘优化 69 2.2.1 chkdsk——磁盘检查 69 2.2.2 defrag——磁盘碎片整理 71 2.2.3 compact——NTFS压缩 73 2.3 磁盘管理与卷标管理 74 2.3.1 diskprt——磁盘和分区管理 75 2.3.2 diskcopy——磁盘复制 79 ...

    精通windows server 2008 命令行与powershell电子书PDF版(第三卷)

    2.2 磁盘优化 69 2.2.1 chkdsk——磁盘检查 69 2.2.2 defrag——磁盘碎片整理 71 2.2.3 compact——NTFS压缩 73 2.3 磁盘管理与卷标管理 74 2.3.1 diskprt——磁盘和分区管理 75 2.3.2 diskcopy——磁盘复制 79 ...

Global site tag (gtag.js) - Google Analytics