测试代码运行时间过慢

问题代码如下:

    @Override
    @GetMapping("/sub-maintains/{page}/{size}")
    public ResponseResult<QueryData<SubMaintainVO>> findMaintainAll(@PathVariable("page") int page, @PathVariable("size") int size) {
        log.info("分页查询提交维修表里头的数据,page={},size={}", page, size);
        long l = System.currentTimeMillis();

        //获取当前用户信息
        Map<String, Object> jwtClaims = Oauth2Util.getJwtClaimsFromHeader(request);

        boolean isSys = (boolean) jwtClaims.get("isSys");
        Page<SubMaintain> maintainAll = null;
        if (isSys) {
            maintainAll = (Page<SubMaintain>) subMaintainService.findMaintainAll(page, size, null);
        } else {
            Integer id = (Integer) jwtClaims.get("id");
            maintainAll = (Page<SubMaintain>) subMaintainService.findMaintainAll(page, size, id);
        }
        List<SubMaintain> result = maintainAll.getResult();

        ArrayList<SubMaintainVO> vos = new ArrayList<>();
        for (SubMaintain maintain : result) {
            // 然后把数据库查到的数据封装到vo里头返回,里面就改了图片地址返回的样式,返回的类型集合。
            // 用多线程的形式(考虑?)
            SubMaintainVO vo = new SubMaintainVO();
            //  BeanUtils.copyProperties(maintain, vo)运行效率太低了,采用原始的get/set方法来。
            this.copySubMaintainTOSubMaintainVO(maintain, vo);
            String maintainImg = maintain.getMaintainImg();
            List<String> voUrls = new ArrayList<>();
            List<String> list = JSONObject.parseArray(maintainImg, String.class);
            for (String s : list) {
                // 要对所有的url+上本服务的ip地址+本服务的端口号+本服务的名称
                voUrls.add(JointStringUtil.jointIPAndPortBeforeImgUrl(s));
            }
            vo.setMaintainImg(voUrls);
            // 从用户中心查找维修人的名字,封装到响应类中
            if (isSys) {
                ResponseResult<AdminLite> adminResult = userClient.findAdminNonSensitiveDataById(maintain.getAdminId());
                // 解决java.util.LinkedHashMap cannot be cast to com.huibo.framework.domain.ucenter.ext.AdminLite问题
                AdminLite data = adminResult.getData();
                if (data != null) {
                    vo.setAdminName(data.getName());
                }
            } else {
                String name = (String) jwtClaims.get("name");
                vo.setAdminName(name);
            }
            vos.add(vo);
        }
        log.info("总运行时间,time={}", System.currentTimeMillis() - l);
        return ResponseResult.succeed(new QueryData<>(vos, maintainAll.getTotal()));
    }
  1. 原因一:
ResponseResult<AdminLite> adminResult = userClient.findAdminNonSensitiveDataById(maintain.getAdminId());
// 解决java.util.LinkedHashMap cannot be cast to com.huibo.framework.domain.ucenter.ext.AdminLite问题
AdminLite data = adminResult.getData();

原来是用JOSN传String,再转用JSON转回对象,才能拿到AdminLite,相当耗性能时间。
2.原因二:所有service的方法都加了事务,不管是查询还是别的,对事务的操作很耗性能时间。
3.原因三:数据库在阿里云上,有网络原因可能调用慢了。
4.原因四: 改进逻辑,如果用户只查询自己的维修信息,就直接从jwt中把自己的名字拿出来放进去,省去了去远程调用用户中心查询用户信息再拼接。
5.原因五:可不可以用多线程的方式拿到用户中的信息拼接后,一起存入返回数组。
6.原因六:就是数据库表设计太垃圾,因该做冗余的,以空间换时间。而且分布式微服务的拆分,旨在解耦,服务间减少调用,或者不要调用。如果太频繁的调用,还不如不拆,这样更有效利用资源。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。