当前位置: 首页 > wzjs >正文

为何网站需改版全包装修包括哪些项目

为何网站需改版,全包装修包括哪些项目,无为教育网站,网站做301将重定向到新域名问题:接口查询时间长,原因在于接口中含有多个组合for循环,且循环中还有SQL调用、rpc调用。 在索引已经最优的情况下,由于n*m次查询,导致接口耗时很慢。 参考文档:https://blog.csdn.net/liu_da_da/article/…

问题:接口查询时间长,原因在于接口中含有多个组合for循环,且循环中还有SQL调用、rpc调用。
在索引已经最优的情况下,由于n*m次查询,导致接口耗时很慢。
参考文档:https://blog.csdn.net/liu_da_da/article/details/124983187

排查过程:
1.检查所有代码结构,查看每一个sql是否已经添加索引。
2.根据阿里云arms,查询接口链路调用,确认sql、rpc等已经最简,且无法优化。
3.思路:使用多个线程,同时去查询,最后汇总结果返回;

优化1:

List<ClassifyInfo> parentList = classifyInfoMapper.selectList(Wrappers.<ClassifyInfo>lambdaQuery().select(ClassifyInfo::getId, ClassifyInfo::getParentId).eq(ClassifyInfo::getSceneCode, param.getSceneCode())
);
List<ContractFileClassifyDTO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(parentList)) {for (ClassifyInfo parent : parentList) {customTaskExecutor.execute(() -> {// 业务代码this.assembleFileClassify(list, parent);});}
}
return list;

异常:返回list为空?
原因:for循环时,一旦使用多线程,循环扔进线程池,本次循环立马结束,接着下一个循环。如此往复,最后直接返回list。
由于循环很快结束,而业务代码执行很慢,导致业务代码未执行完,list中未添加数据,接口已经结束,最后返回空。

解决:使用CountDownLatch,是一种同步工具,它可以使一个或多个线程等待其他线程完成操作后再继续执行。
也就是主线程要等待所有for循环子线程执行完毕之后,再统一汇总返回结果。

优化2:

// 1.根据合同场景,查询合同大类
List<ClassifyInfo> parentList = classifyInfoMapper.selectList(Wrappers.<ClassifyInfo>lambdaQuery().select(ClassifyInfo::getId, ClassifyInfo::getParentId).eq(ClassifyInfo::getSceneCode, param.getSceneCode())
);
CountDownLatch latch = new CountDownLatch(parentList.size());
List<ContractFileClassifyDTO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(parentList)) {for (ClassifyInfo parent : parentList) {customTaskExecutor.execute(() -> {this.assembleFileClassify(list, parent);// 当前线程执行完毕,计数器减1latch.countDown();});}
}
// 等待所有线程执行完毕,统一返回结果
latch.await();
return list;

优化3:
普通List 改为 CopyOnWriteArrayList ,线程安全

// 1.根据合同场景,查询合同大类
List<ClassifyInfo> parentList = classifyInfoMapper.selectList(Wrappers.<ClassifyInfo>lambdaQuery().select(ClassifyInfo::getId, ClassifyInfo::getParentId).eq(ClassifyInfo::getSceneCode, param.getSceneCode())
);
if (CollectionUtils.isEmpty(parentList)) {return Collections.emptyList();
}CountDownLatch latch = new CountDownLatch(parentList.size());
CopyOnWriteArrayList<ContractFileClassifyDTO> list = new CopyOnWriteArrayList<>();
for (ClassifyInfo parent : parentList) {customTaskExecutor.execute(() -> {this.assembleFileClassify(list, parent);// 当前线程执行完毕,计数器减1latch.countDown();});
}
// 等待所有子线程执行完毕,统一返回结果
latch.await();
return list;

总结
未优化前,一个线程执行两个for循环,需要执行nm次,时间复杂度为nm
优化后,使用多线程,时间复杂度为n。

优化4:
当前某个子线程执行异常时,计数器额未减1,导致最后结果为空。
解决:添加 finally,无论线程是否正常执行完毕,计数器都减1

// 1.根据合同场景,查询合同大类
List<ClassifyInfo> parentList = classifyInfoMapper.selectList(Wrappers.<ClassifyInfo>lambdaQuery().select(ClassifyInfo::getId, ClassifyInfo::getParentId).eq(ClassifyInfo::getSceneCode, param.getSceneCode())
);
if (CollectionUtils.isEmpty(parentList)) {return Collections.emptyList();
}CountDownLatch latch = new CountDownLatch(parentList.size());
CopyOnWriteArrayList<ContractFileClassifyDTO> list = new CopyOnWriteArrayList<>();
for (ClassifyInfo parent : parentList) {customTaskExecutor.execute(() -> {try {this.assembleFileClassify(list, parent);} catch (Exception e) {log.error("组装文件分类异常:{}", parent);} finally {// 无论当前线程是否正常执行完毕,计数器都减1latch.countDown();}});
}
// 所有子线程执行完毕,等待的主线程恢复执行
latch.await();
return list;

解决:
1.添加try flnally,无论子线程是正常执行完毕,计数器都减1。
最终异常的那个线程数据,未返回。

2.用 boolean await(long timeout, TimeUnit unit),设置过期时间

执行顺序:
1.主线程 CountDownLatch latch = new CountDownLatch(companyGroup.size());
2.主线程 latch.await();
3.子线程 this.Oa0501DraftContract(param, map, fileClassify, entry);
4.子线程 latch.countDown();
5.主线程 return;

http://www.dtcms.com/wzjs/822714.html

相关文章:

  • 宁波网站建设免费咨询做网站投放广告
  • 做it的中国企业网站提供网站建设加工
  • 驻马店百牛网站建设ih5网页设计
  • 广东双语网站建设多少钱技术先进的网站设计制作
  • 大理网站建设沛宣建设通查询设通网站
  • 仿建网站外贸工艺品网站建设
  • wordpress后台加载页面很慢重庆网站seo好不好
  • 廊坊建设网站企业微信crm系统
  • xx汽车企业网站和信息化建设免费的app推广平台
  • 外贸网站零基础建站商务网站开发心得
  • 青岛市规划建设局网站xampp部署wordpress
  • 备案期间网站如何访问论坛网页制作
  • 百度一下你就知道官方网站公司网站域名申请
  • 长沙网站备案网页布局及版面设计
  • 网站后台修改教程北京优化推广公司
  • 网站权重为零怎么把自己做的网站让别人收到
  • wps怎么做网站今天的新闻大事
  • 网站目录权限设置 user全球商业网
  • 开发做游戏的网站网站制作公司前景
  • 做网站要注册公司么mvc 网站 只列出目录
  • 网站建设汇卓ppt在线制作免费
  • 上海 网站备案代理做钢材生意选什么网站
  • 建立网站大概需要多少钱搜索引擎优化的英语简称
  • 益阳市赫山区建设局网站大专报名入口官网
  • 贵阳网站建设推广公司虚拟主机如何做网站
  • 网站建设公司该如何选择个人简历网页制作代码
  • 建个普通网站深圳东门密室逃脱
  • 南平网站开发公司wordpress 健身预约
  • 小米商城网站建设分析陕西建设网站官方
  • 金阳龙泉苑网站建设六安做网站的公司