【问题标题】:Hibernate takes a long time to get query resultHibernate 需要很长时间才能得到查询结果
【发布时间】:2019-01-10 16:50:47
【问题描述】:

每当我查询一个让 Spring Data/Hibernate 在我的代码上构建查询“findByLabelAndUserId”的表时,它似乎总是需要很长时间。

我在 sql server 上测试查询,它立即返回结果。

在我的项目上测试查询时,提取 10 行需要 4 秒以上。

以下是我认为要做的事情: 使用@Query,但这将花费太长时间来更改许多方法。 我添加了一个全参数构造函数,但没有任何改变。 我将 fetch 方法从渴望更改为惰性,但没有任何改变

我尝试在 jdbc url 中设置此属性:sendStringParametersAsUnicode=false

将时间缩短了 0.5 秒,但这还不够。

这是我的代码:LeaveController:

@RequestMapping(value = "/leaves-management/leaves", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("hasAuthority('view_MY_LEAVE')")
public List<LeaveDto> getAllByUser(HttpServletRequest httpRequest) {
    String token = httpRequest.getHeader(tokenHeader);
    String username = jwtTokenUtil.getUsernameFromToken(token);
    User user = userService.findByUsername(username);
    List<Request> listRequests = requestService.findByLabelAndUserId(LabelRequest.LEAVE, user.getId());
    return listModelToListDtoWithStatus(listRequests);
}

实体部分:

public class Request extends AbstractAuditEntity {
    
    @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private LabelRequest label;

        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private Status status;

        @ManyToOne(fetch = FetchType.LAZY)
        private User user;
    }

我可以做些什么来减少使用 spring data/hibernate 构建查询的时间。

向 jdbc url 添加 sendStringParametersAsUnicode=false 将响应时间从大约 2000 毫秒大幅提高到 200 毫秒。不能相信这一点。非常感谢这个答案。

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    尝试直接在 userService 接口中添加 JPQL 查询。这样,您将使用这个查询,而不是 spring 将生成的查询。

    @Query("SELECT r FROM Request r WHERE r.label = label AND r.user = user")
    Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);
    

    如果这不起作用,请在 userService 接口中再次尝试直接原生查询。

    @Query("SELECT r FROM Table_Request r WHERE r.Column_label = label AND r.Column_user = user",  nativeQuery = true)
    Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);
    

    尽管如此,spring data 的查询效率如此之低还是很奇怪。请记住,如果查询如此简单,问题可能出在应用程序的其他地方。

    祝你好运!

    【讨论】:

      【解决方案2】:

      听起来像是典型的“左连接提取”问题。检查执行的有效查询是什么

      【讨论】:

      • 我查看了休眠的历史。我注意到有些查询使用了 LEFT OUTER JOIN。如何禁用此行为?
      猜你喜欢
      • 1970-01-01
      • 2016-03-18
      • 2018-07-06
      • 1970-01-01
      • 2017-03-16
      • 2016-04-22
      • 2021-12-25
      • 2016-06-17
      • 2021-06-15
      相关资源
      最近更新 更多