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

2019-11-19 14:07:59 +08:00
 shayang888
[ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
[ctor-http-nio-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

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

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

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

不知道是不是因为懒加载的缘故。
wysnylc
2019-11-19 17:00:01 +08:00
@arraysnow #6 跟 spring boot 无关,是 jvm 的熵池问题
chendy
2019-11-19 17:00:41 +08:00
debug=true,看日志吧
spring.mvc.servlet.load-on-startup=1 效果其实不大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX