首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

springboot 启动后,第一次的接口请求总是很慢,后面速度就很快,怎么解决?

  •  
  •   shayang888 · 17 天前 · 2535 次点击
    [ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    [ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
    

    启动的时候看了下,并没有这段日志,第一次请求接口的时候,访问了数据库然后就出现了这个,再次请求的时候也没有再出现了。

    现在问题就是第一次请求的时候因为这个造成速度特别慢,有啥办法可以解决吗

    第 1 条附言  ·  17 天前
    @SpringBootApplication
    @RestController
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @GetMapping(path = "/test")
        public String test() {
            return "test";
        }
    }
    

    就这么一个随便的接口,访问的时候也是第一次请求慢,后面的都是秒返回,这到底是为啥?

    30 回复  |  直到 2019-11-20 00:34:43 +08:00
        1
    ifreeky   17 天前
    第一次请求需要获取数据库连接。
        2
    shayang888   17 天前
    @ifreeky 是的,所以可不可以在 springboot 启动的同时就获取数据库连接呢?
        3
    arraysnow   17 天前   ♥ 7
    spring boot 默认配置三个深坑,一个比一个耗时
    1、dispatcherServlet 是懒加载的
    2、数据库链接是懒加载的
    3、linux 下真随机数生成器
        4
    qiyuey   17 天前
    业务侧预热,或者 DB 预连接,Druid 是支持的,别的不清楚了
        5
    scukmh   17 天前
    linux 下真随机数生成器可否给个链接呢? google 没 google 到
    @arraysnow
        6
    arraysnow   17 天前
    @scukmh https://www.jianshu.com/p/5fe0e6fde941
    用伪随机数生成器,真随机数生成器的噪声收集要很久
        7
    shayang888   17 天前
    @arraysnow 所以第二个没得解吗?
        8
    gejun123456   17 天前
    @shayang888 #7 可以把,在 springboot 启动的时候就去调用下数据库就好了把
        9
    w292614191   17 天前
    启动时候初始化一个,
    spring.datasource.druid.initial-size=1
    这样,你可以观察启动日志,有个 database inited....
        10
    arraysnow   17 天前
    @shayang888 简单粗暴的方式 @PostContrust 里面"SELECT 1",让他在启动时候查一下数据库
        11
    chendy   17 天前
    对于 3 楼说的
    1. 设置 spring.mvc.servlet.load-on-startup=1
    2. 启动方法拿个 dao 的 bean,跑个小查询
    3. 加启动参数 -Djava.security.egd=file:/dev/./urandom
        12
    shayang888   17 天前
    @w292614191
    @gejun123456
    我更换成了 druid 的连接源,还是一样的,第一次请求慢
        13
    troywinter   17 天前
    你们用 java 写服务,不预热???
        14
    shayang888   17 天前
    @arraysnow
    @chendy
    我刚才试了下,即使不去和数据库交互,随便写个接口,也是第一次请求的时间长,后续短
        15
    geying   17 天前
    Controller 第一次访问要实例化?
        16
    shayang888   17 天前
    @arraysnow
    @chendy

    @SpringBootApplication
    @RestController
    public class DemoApplication {

    public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping(path = "/test")
    public String test() {
    return "test";
    }
    }
    就这一个随便的接口,也是第一次请求的时间长,后面就秒返回
        17
    shayang888   17 天前
    @geying 怎么说?
        18
    johnniang   17 天前 via Android
    https://spring.io/blog/2019/10/16/spring-boot-2-2-0

    不知道是不是因为懒加载的缘故。
        19
    wysnylc   17 天前
    @arraysnow #6 跟 spring boot 无关,是 jvm 的熵池问题
        20
    chendy   17 天前
    debug=true,看日志吧
    spring.mvc.servlet.load-on-startup=1 效果其实不大
        21
    shayang888   17 天前
    @chendy
    2019-11-19 17:02:31.814 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter : [17aa98db] HTTP GET "/test"
    2019-11-19 17:02:31.839 DEBUG 53080 --- [ctor-http-nio-3] s.w.r.r.m.a.RequestMappingHandlerMapping : [17aa98db] Mapped to com.example.demo.DemoApplication#test()
    2019-11-19 17:02:31.856 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.r.r.m.a.ResponseBodyResultHandler : Using 'text/plain;charset=UTF-8' given [*/*] and supported [text/plain;charset=UTF-8, text/event-stream, text/plain;charset=UTF-8, */*]
    2019-11-19 17:02:31.857 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.r.r.m.a.ResponseBodyResultHandler : [17aa98db] 0..1 [java.lang.String]
    2019-11-19 17:02:31.860 DEBUG 53080 --- [ctor-http-nio-3] o.s.core.codec.CharSequenceEncoder : [17aa98db] Writing "test"
    2019-11-19 17:02:31.877 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter : [17aa98db] Completed 200 OK
    --------------------------------------------------------------
    2019-11-19 17:02:33.311 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter : [17aa98db] HTTP GET "/test"
    2019-11-19 17:02:33.312 DEBUG 53080 --- [ctor-http-nio-3] s.w.r.r.m.a.RequestMappingHandlerMapping : [17aa98db] Mapped to com.example.demo.DemoApplication#test()
    2019-11-19 17:02:33.312 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.r.r.m.a.ResponseBodyResultHandler : Using 'text/plain;charset=UTF-8' given [*/*] and supported [text/plain;charset=UTF-8, text/event-stream, text/plain;charset=UTF-8, */*]
    2019-11-19 17:02:33.312 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.r.r.m.a.ResponseBodyResultHandler : [17aa98db] 0..1 [java.lang.String]
    2019-11-19 17:02:33.312 DEBUG 53080 --- [ctor-http-nio-3] o.s.core.codec.CharSequenceEncoder : [17aa98db] Writing "test"
    2019-11-19 17:02:33.315 DEBUG 53080 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter : [17aa98db] Completed 200 OK

    2 次的时间明显不一样,第一次花了 60 多 ms,第二次直接 3ms 就完成了
        22
    shayang888   17 天前
    @wysnylc
    @johnniang
    你们都没遇到过这种情况吗?
        23
    wysnylc   17 天前
    @shayang888 #22 你这就是 lazy 懒加载导致的,没别的的可能
        24
    shayang888   17 天前
    @wysnylc 那请问怎么解决呢
        25
    arraysnow   17 天前
    @shayang888 11 楼告诉你了
        26
    wysnylc   17 天前
    @shayang888 #24 熵池问题:https://blog.csdn.net/wysnxzm/article/details/98482143
    spring 第一次访问慢问题:https://www.cnblogs.com/haitao-fan/p/10319920.html
    数据库的你自己找配置属性吧我忘了,上面的同学已经给你点名了问题,希望你学会用百度
        27
    chendy   17 天前
    几十毫秒的差距而已…
    并发请求的话你会看到很多个几十毫秒,应该是 tomcat 内部的一些预热逻辑
    自己预热 /无视 即可
        28
    luopengfei14   17 天前 via iPhone
    在 @postconstructs 注解,
    在该注解的方法中发起一次数据库查询。
    这样等 springboot 启动完后,数据库连接池已经建立好了。
    之前我们项目是在这个方法获取动态的项目配置数据。
        29
    Caballarii   17 天前
    搞半天搞 1,2,说不定直接动 3 就好了
        30
    vjnjc   17 天前
    @chendy #11 的第三点给错了吧,原贴#3 的真随机数是 /dev/random。/dev/urandom 更快但是更假。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1666 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 41ms · UTC 16:37 · PVG 00:37 · LAX 08:37 · JFK 11:37
    ♥ Do have faith in what you're doing.