每隔一段时间后第一次请求耗时特别长

  同一个接口连续请求耗时都是毫秒级别的,当一段时间不请求后会变成秒级别,通过日志跟踪发现业务出处理的时间是毫秒级别的,怀疑是过滤器或者是容器的问题,通过IDEA 远程debug 发现经过一段时间不使用再次请求接口,会寻找 com.mysql.jdbc.MySQLConnection类,猜测是tomcat 丢弃了已加载mysql驱动类,导致需要重新加载,但是该类是mysql5.1.38的目录,项目里面的是mysql8.0 新的目录应该是com.mysql.cj.MysqlConnection 所以这里查找该类的时候会非常耗时。

参考:

  java - 为什么在处理第一个请求时,我的嵌入 tomcat 的 Springboot 太慢了?_Stack Overflow中文网

  java - 同事升级了MySQL驱动8.0,导致应用大量超时 - 个人文章 - SegmentFault 思否

解决方案:

  由于该项目的背景原因所以通过修改tomcat 配置不再丢弃已加载的类

@Configuration
public class EmbeddedTomcatConfiguration {

  @Bean
  TomcatServletWebServerFactory tomcatFactory() {
    return new TomcatServletWebServerFactory() {

      @Override
      protected void postProcessContext(Context context) {
        context.setResources(new ExtractingRoot());
      }
    };
  }
}

疑问:

  1.为什么能成功加载到了mysqlconnection

  2.tomact 丢弃加载的类的时间是在哪里,如果tomcat 没有加载到这个类,那么是通过druid加载到的吗?

 

posted @ 2024-10-19 10:56  永无Bug!!  阅读(27)  评论(0编辑  收藏  举报