小编Pan*_*ssa的帖子

为什么 Spring Rest 服务在第一次请求时速度很慢?

所以这个问题已经被问过几次了,但似乎没有人以可以帮助我的方式回答它。我目前正在为处理产品数据的简单应用程序制作后端。它甚至没有使用 JSP,只是一个普通的 Rest 后端。使用 Spring 的 RestController。

“问题”是:启动后的第一个请求比其他所有请求需要更长的时间才能从服务器获得答案。(我只是用一个简单的 JPA 用户实体来测试 Postman)

需要考虑的一些事项:

  • 它本身可能不是数据库问题,因为它显然只是在第一个传入请求时初始化某些内容,而不是在启动时初始化
  • 在日志中,当第一个实际请求传入(通过 Postman)时,它会显示“初始化 Spring DispatcherServlet 'dispatcherServlet'”。
  • 如果我从数据库中提取所有用户(目前只有一个用户),则启动后的第一个请求需要 140 毫秒(根据 Postman 的说法)。此后,相同的请求最多需要 10ms。
  • 有一个标志对类似问题提出了一些答案:spring.mvc.servlet.load-on-startup=1。尽管这仅删除了上面提到的(DispatcherServlet 的初始化)日志记录。
  • 看起来这是标准行为,与我实际编码实体和/或 RestController 的方式无关。

如何使第一个请求更快/如何强制 Spring 在第一个请求到来之前实际初始化所有内容?

无论如何,一些代码:

用户.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
}
Run Code Online (Sandbox Code Playgroud)

用户控制器.java:

@RestController
@RequestMapping("users")
public class UserController …
Run Code Online (Sandbox Code Playgroud)

java spring request delay postman

10
推荐指数
1
解决办法
1万
查看次数

如何使用分页进行动态 Spring (Boot) JPA 查询?

为了过度简化问题:我们有一个类/表 Wine(表“wines”),除其他属性外,它还具有:

  • 名称: 字符串
  • 描述:字符串
  • 产地: 产地

...其中 Origin 是另一个类(带有表“origins”),只有region: Stringcountry: String

我想要在我的存储库中创建一个搜索方法,供 RestController 使用。

RestController中的方法声明如下:

@GetMapping("/search")
public Wine searchProduct(
        @RequestParam Optional<String> searchTerm,
        @RequestParam Optional<Origin> origin) {
    // ???
}
Run Code Online (Sandbox Code Playgroud)

我现在想做的是:为数据库创建一个查询,其中使用 searchTerm(如果给定),与 origin 相同。而且它应该是可分页的。例子:

SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id 
    WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)
Run Code Online (Sandbox Code Playgroud)

如果未给出搜索词,则整个“() AND”部分不应出现在查询中。如果没有给出 Origin...你就明白了。

我尝试过的事情:

  1. (天真地)在我的存储库中构建一个大规模查询(实现 CrudRepository),如下所示

    Page<Wine> findWinesByNameLikeOrDescriptionLikeAndOriginEquals(..., Pageable pageable);

    • 其中(除了超级丑陋之外,尤其是对于更多属性)可能不起作用,因为:
      1. 没有定义 OR 或 AND 哪个更重要(没有括号)。
      2. 不知道我是否可以将“起源”对象推入其中以使其工作。
      3. 如果这是自定义方法,则不知道 Pageable …

java sql spring jpa spring-boot

5
推荐指数
1
解决办法
5948
查看次数

标签 统计

java ×2

spring ×2

delay ×1

jpa ×1

postman ×1

request ×1

spring-boot ×1

sql ×1