组织架构是: 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("]");