[ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
[ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
启动的时候看了下,并没有这段日志,第一次请求接口的时候,访问了数据库然后就出现了这个,再次请求的时候也没有再出现了。
现在问题就是第一次请求的时候因为这个造成速度特别慢,有啥办法可以解决吗
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping(path = "/test")
public String test() {
return "test";
}
}
就这么一个随便的接口,访问的时候也是第一次请求慢,后面的都是秒返回,这到底是为啥?
1
ifreeky 2019-11-19 14:13:44 +08:00
第一次请求需要获取数据库连接。
|
2
shayang888 OP @ifreeky 是的,所以可不可以在 springboot 启动的同时就获取数据库连接呢?
|
3
arraysnow 2019-11-19 14:26:34 +08:00 9
spring boot 默认配置三个深坑,一个比一个耗时
1、dispatcherServlet 是懒加载的 2、数据库链接是懒加载的 3、linux 下真随机数生成器 |
4
qiyuey 2019-11-19 14:26:37 +08:00
业务侧预热,或者 DB 预连接,Druid 是支持的,别的不清楚了
|
6
arraysnow 2019-11-19 14:34:57 +08:00
|
7
shayang888 OP @arraysnow 所以第二个没得解吗?
|
8
gejun123456 2019-11-19 15:10:22 +08:00
@shayang888 #7 可以把,在 springboot 启动的时候就去调用下数据库就好了把
|
9
w292614191 2019-11-19 15:49:08 +08:00
启动时候初始化一个,
spring.datasource.druid.initial-size=1 这样,你可以观察启动日志,有个 database inited.... |
10
arraysnow 2019-11-19 15:55:48 +08:00
@shayang888 简单粗暴的方式 @PostContrust 里面"SELECT 1",让他在启动时候查一下数据库
|
11
chendy 2019-11-19 16:18:32 +08:00 1
对于 3 楼说的
1. 设置 spring.mvc.servlet.load-on-startup=1 2. 启动方法拿个 dao 的 bean,跑个小查询 3. 加启动参数 -Djava.security.egd=file:/dev/./urandom |
12
shayang888 OP |
13
troywinter 2019-11-19 16:25:12 +08:00
你们用 java 写服务,不预热???
|
14
shayang888 OP |
15
geying 2019-11-19 16:51:19 +08:00
Controller 第一次访问要实例化?
|
16
shayang888 OP @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 OP @geying 怎么说?
|
18
johnniang 2019-11-19 16:57:54 +08:00 via Android
|
20
chendy 2019-11-19 17:00:41 +08:00
debug=true,看日志吧
spring.mvc.servlet.load-on-startup=1 效果其实不大 |
21
shayang888 OP @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 OP |
23
wysnylc 2019-11-19 17:08:16 +08:00
@shayang888 #22 你这就是 lazy 懒加载导致的,没别的的可能
|
24
shayang888 OP @wysnylc 那请问怎么解决呢
|
25
arraysnow 2019-11-19 17:20:45 +08:00
@shayang888 11 楼告诉你了
|
26
wysnylc 2019-11-19 17:25:28 +08:00
@shayang888 #24 熵池问题:https://blog.csdn.net/wysnxzm/article/details/98482143
spring 第一次访问慢问题:https://www.cnblogs.com/haitao-fan/p/10319920.html 数据库的你自己找配置属性吧我忘了,上面的同学已经给你点名了问题,希望你学会用百度 |
27
chendy 2019-11-19 17:52:52 +08:00
几十毫秒的差距而已…
并发请求的话你会看到很多个几十毫秒,应该是 tomcat 内部的一些预热逻辑 自己预热 /无视 即可 |
28
luopengfei14 2019-11-19 19:54:33 +08:00 via iPhone
|
29
Caballarii 2019-11-19 20:17:22 +08:00
搞半天搞 1,2,说不定直接动 3 就好了
|
30
vjnjc 2019-11-20 00:34:43 +08:00
@chendy #11 的第三点给错了吧,原贴#3 的真随机数是 /dev/random。/dev/urandom 更快但是更假。
|
31
shitcode 2020-04-07 20:21:24 +08:00
urandom 试了没卵用,启动时预热有效果。
|
32
Ahy 2020-05-19 14:35:47 +08:00
hello 最后怎么解决的呢? 有什么解决方案么?
|
33
Ahy 2020-05-19 14:36:08 +08:00
|