【发布时间】:2020-11-11 03:06:41
【问题描述】:
所以这个问题已经被问过几次了,但似乎没有人以可以帮助我的方式回答它。我目前正在为处理产品数据的简单应用程序制作后端。它甚至没有 JSP,只是一个普通的 Rest 后端。使用 Spring 的 RestControllers。
“问题”是:启动后的第一个请求从服务器获得响应所需的时间比其他所有请求都要长。 (我只是用一个简单的 JPA 用户实体用 Postman 进行测试)
需要考虑的一些事项:
- 这本身可能不是数据库问题,因为它显然只是在第一次传入请求而不是启动时初始化某些内容
- 在日志中,当第一个实际请求进入(通过 Postman)时,它会显示“正在初始化 Spring DispatcherServlet 'dispatcherServlet'”。
- 如果我从数据库中拉出所有用户(目前只有一个用户),启动后的第一个请求需要 140 毫秒(根据 Postman)。之后,相同的请求始终需要最多 10 毫秒。
- 对于类似问题的建议有一个标志:spring.mvc.servlet.load-on-startup=1。虽然这只会删除上面提到的(DispatcherServlet 初始化的)日志记录。
- 这似乎是标准行为,与我实际编写实体和/或 RestController 的方式无关。
如何使第一个请求更快/如何强制 Spring 在第一个请求到来之前实际初始化所有内容?
还是有一些代码:
User.java:
@Entity
@Table(name = "users")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NonNull
private String firstName;
@NonNull
private String lastName;
@NonNull
@OneToOne(cascade = CascadeType.ALL)
private Address billingAddress;
//a bit more. a list and another address
}
UserController.java:
@RestController
@RequestMapping("users")
public class UserController {
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping()
public List<User> getAllUsers() {
return (List<User>) userRepository.findAll();
}
//more stuff
}
【问题讨论】:
-
你是如何运行/部署应用程序的?
-
IntelliJ 刚刚为我创建了一个运行配置。 (Spring Boot 应用程序)
-
Spring 还是 Spring Boot?这会产生很大的不同,无论是否启用调试/开发工具(这也会产生影响)。您应该测试一个实际部署的,而不是一个需要调试等的。另外,您应该真正将
spring.mvc.servlet.load-on-startup设置为 1 或更高(否则它将被延迟)。它不会删除日志记录,但现在它会被急切地实例化并启动。 -
是的,我的意思是 Spring Boot。而且 afaik 它没有开发工具,只是正常的日志记录。 K,我将它设置为 1。¯_(ツ)_/¯
标签: java spring request postman delay