每隔一段时间后第一次请求耗时特别长
同一个接口连续请求耗时都是毫秒级别的,当一段时间不请求后会变成秒级别,通过日志跟踪发现业务出处理的时间是毫秒级别的,怀疑是过滤器或者是容器的问题,通过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加载到的吗?