每当我查询一个让 Spring Data/Hibernate 在我的代码上构建查询“findByLabelAndUserId”的表时,它似乎总是要花很长时间。
我在 sql server 上测试查询,它立即返回结果。
当我在我的项目上测试查询时,获取 10 行花费了 4 多秒。
以下是我想做的事情: 使用@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 data/hibernate 构建查询的时间。
将 sendStringParametersAsUnicode=false 添加到 jdbc url 后,响应时间从大约 2000 毫秒大幅缩短至 200 毫秒。不敢相信这一点。非常感谢这个答案。
最佳答案
尝试直接在 userService 接口(interface)中添加 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 接口(interface)中再次尝试直接原生查询。
@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的查询效率这么低。请记住,如果查询非常简单,问题可能出在您应用程序的其他地方。
祝你好运!
https://stackoverflow.com/questions/54133401/
相关文章:
github - 不存在 Jira 票证时如何阻止 GitHub 拉取请求
scikit-learn - 使用类权重的网格搜索和 KerasClassifier
javascript - TypeORM M2O O2M关系使用级联插入时外键为空
reactjs - Chart 中的 SVG 在 Prop 更改后不会重新渲染。 react + d
django - 在批量 python 中创建资源时如何跳过现有对象实例
python - Apache Beam python Bigquery 将流式插入更改为批量插入?