关于后台entity与vo转换缓慢

Blade 已结 2 2469
rohon
rohon 剑者 2019-06-12 10:04
悬赏:5

比如用户里面包含 所属公司 所属项目,部门,角色,这样UserWrapper里面查询转换的时候就会出现每一个用户都需要根据用户所属这些的id查询相关信息,如果100个用户就会出现 几百个sql执行,请问是我理解的有问题吗?或者这种问题应该如何解决?下面我贴出来UserWrapper代码


@Override
public UserVO entityVO(User user) {
   UserVO userVO = BeanUtil.copy(user, UserVO.class);
   assert userVO != null;
   List roleName = SysCache.getRoleNames(user.getRoleId());
   List deptName = SysCache.getDeptNames(user.getDeptId());
   if(StringUtil.isEmpty(user.getCompanyCode())){
      userVO.setCompanyName("未分配");
   }else{
      List companyName = SysCache.getCompanyName(user.getCompanyCode());
      userVO.setCompanyName(Func.join(companyName));
   }

   userVO.setRoleName(Func.join(roleName));
   userVO.setDeptName(Func.join(deptName));
   userVO.setSexName(DictCache.getValue("sex", Func.toInt(user.getSex())));

   Project project = null;

   if(user.getId()!= null){
      project = SysCache.getProjectByUserId(user.getId());
   }
   if(StringUtil.isEmpty(project)){
      userVO.setProjectCode("0L");
      userVO.setProjectName("未分配");
   }else{
      userVO.setProjectCode(project.getProjectCode()+"");
      userVO.setProjectName(project.getProjectName());
   }
   return userVO;
}


@Override
public List listVO(List list) {
   List collect = list.stream().map(this::entityVO).collect(Collectors.toList());
   return collect;
}

@Override
public IPage pageVO(IPage pages) {
   IPage userVOIPage =  super.pageVO(pages);
   userVOIPage.setRecords(userVOIPage.getRecords().stream().map(this::entityVO).collect(Collectors.toList()));
   return userVOIPage;
}


2条回答
  •  admin
    admin (最佳回答者)
    2019-06-12 10:09

    第一次会慢,因为会请求接口。但是之后就放到缓存了,都是通过 

    SysCache.getRoleNames(user.getRoleId());

    来获取的,速度很快。100多个也不会去请求数据库。


    你现在具体是什么问题,每次都会去访问数据库么?


    如果比较慢,推荐在分页的方法改为自定义sql,使用left join来直接查出对应的数据

    0 讨论(4)
  • 2019-06-12 10:19

    这个问题本质上说是 sql N+1的问题。

    要解决的话,

    1、要么在sql层, 用复杂的sql拼装数据。

    2、要么在代码层, 尽量避免在for循环里访问数据库。 在for里只拼装sql, 比如用sql in (xx,xx), 做一条sql查出批量数据。

    0 讨论(1)
提交回复