情景: 项目信息存储的表很多,更新项目信息时 同时将项目的汇总信息同步到一个中间表中(该中间表要求实时同步,汇总了多个表的信息). 框架:spring boot 前端:vue
最开始使用的时更新完项目主体信息后在调用同步中间表的方法,但该方法执行时间过长,(优化更新语句以及索引都已基本优化),所以想到使用异步来实现该操作.
方法1:将同步方法提取出来直接用注解的方式添加新的方法
@Async public void asynchroProjectWholeProcess(String projectId) { // 实时更新工程全流程报表项目部分中间表 by dy 2020-01-21 logger.info("=======================异步执行同步项目信息开始=========================="); projectROneService.synchroProjectWholeProcess(projectId); logger.info("=======================异步执行同步项目信息结束=========================="); }
执行时报错,提示"循环依赖",本着原代码不动的原则,新建一个新的类然后使用该类下的带有注解的方法
@Component public class ProjectCommonAsyncManageImpl implements ProjectCommonAsyncManage { private static Logger logger = Logger.getLogger(ProjectCommonAsyncManageImpl.class); @Autowired private ProjectROneService projectROneService; @Override @Async public void asynchroProjectWholeProcess(String projectId) { // 实时更新工程全流程报表项目部分中间表 by dy 2020-01-21 logger.info("=======================异步执行同步项目信息开始=========================="); projectROneService.synchroProjectWholeProcess(projectId); logger.info("=======================异步执行同步项目信息结束=========================="); } }
重新编译执行,测试成功.
方法2:在查怎样异步执行时查询到最多的是新起一个新的线程也能实现该操作,所以就各种百度了下
要用到Thread类 ,然后学习了下这个
最终百度的方法是
// 实时更新工程全流程报表项目部分中间表 by dy 2020-01-21 // projectCommonAsyncManage.asynchroProjectWholeProcess(projectId); new Thread(new Runnable() { @Override public void run() { logger.info("=======================新线程执行同步项目信息开始=========================="); projectROneService.synchroProjectWholeProcess(projectId); logger.info("=======================新线程执行同步项目信息结束=========================="); } }).start();
弊端:
1、每次new Thread新建对象性能差
2、线程缺乏统一管理,可能无限制新建线程,相互之间出现竞争,极可能占用过多系统资源导致死机或者oom。
3、缺乏更多功能,比如:定时定时执行,定期执行,线程中断。
版权声明:本文为CSDN博主「垚石」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jinshitou2012/article/details/78543426
以上这段是直接在原更新项目状态的方法中直接使用的起一个新的线程,弊端已经列明了
然后问了下同事后,同事说其中一个方法执行报错时后期排查问题会很麻烦...