Springboot启动优化之业务数据异步加载

有一些项目依赖的数据,需要项目启动的同时加载到应用程序中,这也是造成项目启动慢的一个很重要的原因。

那么经过分析以后,能够确认某些数据是可以后续加载的,此时可以异步加载的方法。

下面来介绍。

第一步,打印Bean加载的时间,观察那些Bean加载的慢。

// BeanInitCostTimeBeanPostProcessor.java
@Slf4j@Componentpublic class BeanInitCostTimeBeanPostProcessor implements BeanPostProcessor {  private static final ConcurrentHashMap<String, Long> START_TIME = new ConcurrentHashMap<>();  @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) {    START_TIME.put(beanName, System.currentTimeMillis());    return bean;  }  @Override  public Object postProcessAfterInitialization(Object bean, String beanName) {    if(Objects.nonNull(START_TIME.get(beanName))) {      log.info("beanName:{}, cost:{}", beanName, System.currentTimeMillis() - START_TIME.get(beanName));    }    return bean;  }}
// SleepBean.java
@Configurationpublic class SleepBean {  @Bean(initMethod = "initWithSleep")  public TestBean testLongTimeBean() {    return new TestBean();  }    public static class TestBean {    public void initWithSleep() throws InterruptedException {      Thread.sleep(10000);    }  }}

执行效果如图:

加载都是毫秒级的,累计起来就很多了。

另外,如果要加载业务数据,一系列处理的话,时间会很长,影响项目启动。

第二步,加入异步方法,延迟加载业务bean

// AsyncTestLongTimeBean.java
@Slf4jpublic class AsyncTestLongTimeBean extends SleepBean.TestBean implements FactoryBean<TestBean> {  private AtomicBoolean started = new AtomicBoolean(false);  @Override  public TestBean getObject() throws Exception {    return this;  }  @Override  public Class> getObjectType() {    return SleepBean.TestBean.class;  }    @Override  public void initWithSleep() {    long start = System.currentTimeMillis();    new Thread(() ->  {      try {        super.initWithSleep();      } catch (InterruptedException e) {      }      // 保持操作的原子性      started.compareAndSet(false, true);      log.info("async bean init cost:{} ms", System.currentTimeMillis() - start);    }).start();  }  }
// SleepBean.java 修改@Configurationpublic class SleepBean {  @Bean(initMethod = "initWithSleep")  public TestBean testLongTimeBean() {    return new AsyncTestLongTimeBean();  }    public static class TestBean {    public void initWithSleep() throws InterruptedException {      Thread.sleep(10000);    }  }}

效果很明显,它不影响项目启动了。

这个用户还是很大,很多业务数据,可以搞成异步初始化,不影响项目启动,还可以让项目运行时,速度快。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=14723,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?