每当我查询一个让Spring Data / Hibernate在我的代码上建立查询'findByLabelAndUserId'的表时,它似乎总是要花很多时间。
我在sql服务器上测试了查询,它立即返回了结果。
当我在项目上测试查询时,花了4秒钟以上的时间才能获取10行。
这是我想做的事情: 使用@Query,但是更改许多方法将花费很长时间。 我添加了一个全参数构造函数,但没有任何改变。 我将获取方法从渴望更改为懒惰,但没有任何改变
我试图在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数据/休眠状态的查询时间。
答案 0 :(得分:0)
尝试直接在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数据执行的查询效率如此低下却很奇怪。如果查询是如此简单,请记住,问题可能出在应用程序的其他地方。
祝你好运!
答案 1 :(得分:0)
听起来像是典型的“左连接提取”问题。检查执行的有效查询是什么