问题代码如下:
@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()));
}
- 原因一:
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.原因六:就是数据库表设计太垃圾,因该做冗余的,以空间换时间。而且分布式微服务的拆分,旨在解耦,服务间减少调用,或者不要调用。如果太频繁的调用,还不如不拆,这样更有效利用资源。